有条件地调用R中的特定列

时间:2014-05-28 22:10:26

标签: python r parsing

我有一个包含大文本文件的.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的原因。如果有更好的方法,我可以接受它。

3 个答案:

答案 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参数选择列8select

这给出了:

#    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)