我有一个.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更熟悉),以便它在行中返回第二个值(在本例中为1),并在行中返回第八个值(在在这种情况下(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}'"))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句