【问题标题】:Subset a matrix using a column from another matrix in R使用 R 中另一个矩阵的列对矩阵进行子集化
【发布时间】:2011-12-12 20:53:26
【问题描述】:

我有一个矩阵X1,有 6 列。此X1 矩阵中的第 3 列包含RouteNo。我还有一个向量V1,它是从另一个矩阵中提取的。此向量中很少有值与X1 中的RouteNo 匹配。任务是从矩阵X1 中获取一个子集,其中X1 中的RouteNoV1 中的RouteNo 匹配。 V1 包含比矩阵 X1 更多的 RouteNo

> 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

我尝试使用subset 函数,但没有得到想要的结果。我希望得到如下矩阵

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

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

【问题讨论】:

  • Joshua Ulrich,你如何格式化 StackOverflow 网站上的 R 代码?
  • 缩进四个空格或使用花括号按钮,您可以在帖子上按编辑,自己查看
  • NB_R 您不想对在矩阵中用作列名的向量使用相同的名称。给你的名字起个有用的名字。
  • 作为指针,请注意,当您说“矩阵”时,您的真正意思似乎是“数据框”。在 R 中,这是两种不同类型的对象。尽管它们的行为方式相似(并且意图如此),但混淆它们通常会导致错误。

标签: r subset


【解决方案1】:

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

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

【讨论】:

  • @ulvund - 去过那里,做过,有几个小时挠头来证明这一点:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 2018-04-09
  • 2011-02-10
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多