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

Python 有条件地调用R中的特定列,python,r,parsing,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,237

我有一个.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),这样它就只为第三个值为“snp”的行返回第二个值(在本例中为1)和第八个值(在本例中为G)(在本例中为第5行)。在本例中,我期望的结果是:

1 G
以下是我到目前为止得出的结论:

maf <- file("file.gz")
maflist <- strsplit(readLines(maf), ",")
close(maf)

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

maf也许可以读入这些行,并对它们进行过滤,以仅包含您感兴趣的内容

lines = readLines(maf)
lines = lines[grep(",snp,", lines), fixed=TRUE]
然后从文本连接中以data.frame的形式读取所选行

snps = read.delim(textConnection(lines), sep=",", header=FALSE)

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

maflist[sapply(maflist, '[', 3)=="snp",]
将列表子集以仅获取向量中第三项为“snp”的行

您知道,
awk
如果您在unix机器上,这将非常容易。差不多

read.table(pipe("gunzip -c file.gz | awk -F',' '$3==\"snp\"{ print $2, $8}'"))

下面是使用
数据的一种方法。表
fread

fread("gunzip -c file.txt.gz | grep ',snp'", select=c(2,8))
我们解压缩文件并对包含
、snp
的行执行
grep
,然后使用
select
参数选择列
2
8

这使得:

#    V2 V8
# 1:  1  G

HTH

我完全抛弃了R,只使用了你的awk命令。它工作得很好。我最近了解了awk,并且越来越喜欢它。非常感谢。