2012-02-21 55 views
2

这是一个非常简单的问题。如何在列中使用多个字符来子集数据

我有一个冗长的数据集,并希望根据特定列中的某些条目创建子集。在这种情况下,我将其设置是这样的:

实施例的数据:

> NL 

SNP alleles 

rs1234 A_T 

rs1235 A_G 

rs2343 A_T 

rs2342 G_C 

rs1134 C_G 

rs1675 T_A 

rs8543 A_T 

rs2842 G_A 

P <- subset(NL, alleles = "A_T", alleles = "T_A", alleles = "G_C", alleles = "C_G") 

这将运行没有错误,但所得到的P不以任何方式子集(P的尾仍然显示相同数量的作为原始NL的条目)。

我在做什么错?

+0

你想让你的'subset'成为'vector''中的等位基因''('A_T','T_A','G_C','C_G')'?附:这是一个暗示的谜语。 – Justin 2012-02-21 20:49:15

回答

4

当你的意思是“==”时,最明显的错误是使用“=”。但我从上下文猜你真的想“分裂”这样的数据:

split(NL, NL$alleles) 

,这将创造dataframes每一个具有alleles值的一个列表。

也许你想使用模式匹配:

NL[ grepl("C_G|G_C|A_T|T_A", NL$alleles), ] 
    SNP alleles 
1 rs1234  A_T 
3 rs2343  A_T 
4 rs2342  G_C 
5 rs1134  C_G 
6 rs1675  T_A 
7 rs8543  A_T 

而且与我所想的是你的意见,例如说明:

P <- read.table(text="V1 V2 V3 V4 V5 V6 alleles 
15116 25 rsX 0 123412 G A G_A 
15117 25 rsX1 0 23432 A C A_C 
15118 25 rsX2 0 234324 A G A_G 
15119 25 rsX3 0 3423 A G A_G 
15120 25 rsX4 0 2343223 C A C_A 
15121 25 rsX5 0 23523423 A G A_G", header=TRUE) 

P[ grepl("G_A", NL$alleles), ] 

#  V1  V2 V3  V4 V5 V6 alleles 
# 15116 25 rs306910 0 154613671 G A  G_A 

子集版本:

subset(P, alleles %in% c("G_A", "A_G")) 

     V1 V2 V3  V4 V5 V6 alleles 
15116 25 rsX 0 123412 G A  G_A 
15118 25 rsX2 0 234324 A G  A_G 
15119 25 rsX3 0  3423 A G  A_G 
15121 25 rsX5 0 23523423 A G  A_G 
+0

使用==会给我以下错误:** [.data.frame'(x,r,vars,drop = drop)中的错误: 找不到对象'alleles'**但是,我可以使用split。谢谢! – mfk534 2012-02-21 20:58:30

+1

@ user1224314如果是这种情况,那么您在问题中提供的数据以及您在计算机上使用的数据会有所不同。我们只能根据您提供的示例数据提供帮助。 – joran 2012-02-21 21:03:48

+0

@ user1224314确保您的NL对象是数据框,并且等位基因列的名称是“等位基因”。你可以使用'str(NL)'来查看它有什么结构,'name(NL)'来查看列名。 – Gregor 2012-02-21 21:04:07

0

=用于传递参数或赋值。你需要的是测试是否属实,使用==。你也传递了多个标准,而不是指定应该如何组合。我很确定你想要那些条件为的任何的子集(不是全部),但是R不。对于这种情况,你可以使用%in%操作:

P <- subset(NL, alleles %in% c("A_T", "T_A", "C_G")) 

还要注意,你想给subset几个条件,但是你不告诉它如何将它们结合起来。我可以看到你想要的是任何条件为真的行,但是你必须告诉R使用OR运算符|,例如,

P <- subset(NL, alleles == "A_T" | alleles == "T_A" | alleles == "C_G") 

上面的%in%运算符就像这样的简写。

相关问题