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

2024-05-14 17:09:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.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",]

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


Tags: 文件结构file文本文件chr1gzsnpmultiplier
3条回答

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

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

对列表进行子集化,以仅获取向量中第三项为“snp”的行。你知道吗

你知道,如果你在unix机器上,awk会让这变得非常简单。像这样的

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

这里有一种使用data.tablefread的方法:

fread("gunzip -c file.txt.gz | grep ',snp'", select=c(2,8))

我们解压文件并为那些包含,snp的行grep,然后使用select参数选择列28。你知道吗

这将提供:

#    V2 V8
# 1:  1  G

HTH公司

也许读入这些行并过滤它们,使其仅包含您感兴趣的内容

lines = readLines(maf)
lines = lines[grep(",snp,", lines), fixed=TRUE]

然后将所选行作为数据框从文本连接

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

相关问题 更多 >

    热门问题