Re: [问题] 资料的截取与逻辑判断

楼主: egoweaver (Hiko)   2018-06-28 18:23:38
用 R 解的话大概会是这样:
# 下载 package 并安装 (只有第一次执行需要)
install.packages("dplyr")
# 加载需要的 package
library(dplyr)
# 读取你的原始档 (假设它是 .csv)
rawdata <- read.csv([path to yourfile], header = TRUE,
stringsAsFactor = FALSE)
# 如果是其他格式
# sep 后面填入资料分隔 column 的符号
# rawdata <- read.table([path to yourfile], header = TRUE,
stringAsFactor = FALSE, sep = "\t")
# 判断 A_1 A_2 是否相同 (结果存在 con1 这一栏)
rawdata <- mutate(rawdata, con1 = A_1 == A_2)
# 计算相同的列数
sum(rawdata$con1)
# 判断 A_1 和 A_2 是否是 "./." (结果存在 con2 这一栏)
rawdata <- mutate(rawdata, con2 = (A_1 == "./." & A_2 == "./."))
# 计算 A_1 和 A_2 都是 "./." 的列数
sum(rawdata$con2)
# A_1 和 A_2 不相同的列数
sum(!rawdata$con1) # 把判定从“是否相同”反过来就好
# 计算 "./." 的总量
isSymbol <- rawdata == "./." # 判断哪些格子的内容是 "./."
numOfSymbol <- rowSums(isSymbol) # 计算每列“是 "./."”的格子总量
啊,打完发现我不是在隔壁版。补个 Linux 点。用 awk 的话其实也满快的:
# 计算 A_1 与 A_2 相同的列数 (若它们分别为第一第二栏)
awk '$1 == $2 {i++}END{print i}' [your raw data]
# 计算 A_1 与 A_2 都同样是 ./. 的列数
awk '$1 == "./." && $2 == "./." {i++}END{print i}' [your raw data]
# 计算 A_1 与 A_2 不相同的列数
awk '$1 != $2 {i++}END{print i}' [your raw data]
# 计算每列中有几个 "./."
awk '{for(i = 1; i <= NF; i++) {if($i == "./.") n++}; \
print n >> "number.txt";}' [your raw data]
# 如果要把 "./." 的个数当作一栏并回原档案
paste [your raw data] number.txt >> newfile.txt
※ 引述《k97231 (AL)》之铭言:
: 我现在正在处理一些有关于生物资讯的资料
: 基本上的资料格式长这样
: ID A_1 A_2 B_1 B_2 ……
: 1 0/0 0/0
: 2 0/0 ./.
: 3 ./. ./.
: 4. 0/0 0/1
: 5. 1/1 0/1
: 6. 0/1 0/1
: ……
: 接着我想要做几件事情
: 依据相同字母的样本(像是A_1和A_2)
: 逐列统计四种字段的数量
: 1. A_1和A_2相同
: 2. A_1和A_2都一样是./.
: 3. A_1和A_2不一样
: 4. 以及任一样本含有./.的字段数量
: 以上表为例
: A_1和A_2相同的数量是3 (ID1, 3, 6)
: 两行数值都是./.的数量是1
: A_1和A_2不同的列有3 (ID2, 4, 5)
: 有任一行数值为./.的数量为2 (ID2, 3)
: 然后统计成四个数值这样并输出
: 不过有问题的部分是要如何撷取含有特定字串的两栏
: 并逐行进行逻辑判断?
: 我知道可以利用awk逐行进行撷取并用grep计算数量并输出 (不过awk和grep的管线顺序还没参透)
: 但要如何依据相同字母撷取特定行就不清楚了
: 想问有什么指令可以针对首列带有特定字串的行进行撷取?
作者: k97231 (AL)   2018-07-02 22:55:00
喔喔 真的好感谢

Links booklink

Contact Us: admin [ a t ] ucptt.com