我有一个包含大文本文件的.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),并在行中返回第8个值(在这种情况下为G)仅适用于行中第3个值为" snp" (在这种情况下第5行)。在这个例子中,我期望的结果是:
1 G
这是我到目前为止所得到的:
maf <- file("file.gz")
maflist <- strsplit(readLines(maf), ",")
close(maf)
maflist[maflist[,3]=="snp",]
但是我得到的维数不正确。我在阅读文件时遇到了麻烦,因为每行中的列数不相等,这就是我最终使用strsplit
的原因。如果有更好的方法,我可以接受它。
答案 0 :(得分:3)
strsplit返回一个列表,其中每个列表项都包含拆分值的向量。因此列表的长度与输入的长度相同。你不能像完成那样将矩阵索引到矩阵中。你可以做这样的事情
maflist[sapply(maflist, '[', 3)=="snp",]
将列表子集化以仅获取向量中第三项为“snp”的行。
你知道,如果你在unix机器上,awk
会让这变得非常简单。像
read.table(pipe("gunzip -c file.gz | awk -F',' '$3==\"snp\"{ print $2, $8}'"))
答案 1 :(得分:2)
使用data.table
&#39; s fread
的一种方式:
fread("gunzip -c file.txt.gz | grep ',snp'", select=c(2,8))
我们为包含grep
的行解压缩文件和,snp
,然后我们只使用2
参数选择列8
和select
。
这给出了:
# V2 V8
# 1: 1 G
HTH
答案 2 :(得分:1)
也许阅读其中的内容并过滤它们以包含您对
感兴趣的内容lines = readLines(maf)
lines = lines[grep(",snp,", lines), fixed=TRUE]
然后从文本连接中读取所选行作为data.frame
snps = read.delim(textConnection(lines), sep=",", header=FALSE)