使用R中另一个矩阵的列子集矩阵

时间:2011-12-12 20:53:27

标签: r subset

我有一个包含6列的矩阵X1。此X1矩阵中的第3列包含RouteNo。我还有一个从另一个矩阵中提取的向量V1。此向量中的少数值与RouteNo中的X1匹配。任务是从矩阵X1中获取子集,其中RouteNo的{​​{1}}与X1的{​​{1}}匹配。 RouteNo比矩阵V1中包含额外V1

RouteNo

我尝试使用X1功能,但我没有得到理想的结果。我希望得到如下矩阵

> X1
    V1 V2       V3 V4   V5 V6
1    1  2 84072082  1 2000  0
2    2  2 84046006  1 2000  0
3    3  2 84046006  1 2001  0
4    4  2 84046006  1 2002  0
5    5  2 84021002  1 2002  0
6    6  2 84021002  1 2003  0
7    7  2 84021002  1 2003  0
8    8  2 84021002  1 2004  0
9    9  2 84021002  1 2005  0
10  10  2 84021002  1 2005  0
11  11  2 12468015  1 2006  0
12  12  2 12468015  1 2007  0
13  96  2 12468015  2 2000  0
> V1
 [1] 84021001 84021002 84021105 84046006 84046007 84046008 84046009 84046011 84046013 84046014
> n2 = subset(X1, subset = X1[,3] %in% V1)
> dim(n2)
[1] 0 6

还有其他方法可以获得结果吗?任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:4)

您遇到了范围问题。您的data.frame V1中有一个名为x1的列。将查找向量更改为不是列名的名称,一切都应该没问题,即:

subset(x1, V3 %in% v1)

或使用[直接索引

x1[x1$V3 %in% V1,]

证据在布丁中:

txt1 <- "    V1 V2       V3 V4   V5 V6
1    1  2 84072082  1 2000  0
2    2  2 84046006  1 2000  0
3    3  2 84046006  1 2001  0
4    4  2 84046006  1 2002  0
5    5  2 84021002  1 2002  0
6    6  2 84021002  1 2003  0
7    7  2 84021002  1 2003  0
8    8  2 84021002  1 2004  0
9    9  2 84021002  1 2005  0
10  10  2 84021002  1 2005  0
11  11  2 12468015  1 2006  0
12  12  2 12468015  1 2007  0
13  96  2 12468015  2 2000  0"
txt2 <- "84021001 84021002 84021105 84046006 84046007 84046008 84046009 84046011 84046013 84046014"

x1 <- read.table(textConnection(txt1))
#Note the lowercase
v1 <- read.table(textConnection(txt2))
#Make "V1" as you have it
V1 <- v1 

> #Bad
> dim(subset(x1, V3 %in% V1))
[1] 0 6
> #Good
> dim(subset(x1, V3 %in% v1))
[1] 9 6
#Does subset method equal the direct indexing method
> all.equal(subset(x1, V3 %in% v1),x1[x1$V3 %in% V1,])
[1] TRUE