我有一个包含大文本文件的.gz文件结构如下:

propVarQ,0.1
multiplier,2.0
p,1,chr1,3
p,1,locus1,80828536,35.735,0.43562663
p,1,snp,1,80828735,G/A,GGGGGGAG,G,0.9166667
p,1,p,7699,0.09534625
p,1,p,317,0.09534625
p,1,p,6181,0.09534625
p,1,p,6570,0.09534625
p,1,p,2370,0.09534625

重复大约1000次我需要在R中解析它(虽然python也是一个选项,但我更熟悉R),以便它只返回行中第2个值(在本例中是1),第8个值(在本例中是G),行中第3个值是“snp”(在本例中是5行)在这个例子中,我期望的结果是:
1 G

以下是我到目前为止得出的结论:
maf <- file("file.gz")
maflist <- strsplit(readLines(maf), ",")
close(maf)

maflist[maflist[,3]=="snp",]

但是我得到的维数不正确。我在读取文件时遇到问题,因为每行中的列数不相等,这就是我最终使用strsplit的原因。如果有更好的办法,我愿意接受。

最佳答案

strsplit返回一个列表,其中每个列表项包含拆分值的向量所以列表的长度与输入的长度相同。你不能像矩阵那样索引它你可以这样做

maflist[sapply(maflist, '[', 3)=="snp",]

对列表进行子集以仅获取向量中第三项为“snp”的行。
你知道,awk会让你在unix机器上的操作变得非常简单有点像
read.table(pipe("gunzip -c file.gz | awk -F',' '$3==\"snp\"{ print $2, $8}'"))

09-06 16:10