1

在给定多个参数的情况下,我希望从 R 中的数据框中选择一组行。通常这可以使用 OR 语句来完成,但是这些值被存放在一个数组中。我正在查询它们(并且没有运气):

一些让我们滚动的数据:

x = array(c(1,2,3),c(5,5))
y=c(1,2)

我目前使用的命令是(按第 1 列过滤):

x[x[,1] == y, ]

上面的命令产生这个错误:

Warning message:
In x[, i] == y :
  longer object length is not a multiple of shorter object length

这是有道理的。我只是不知道如何绕过它。

我正在寻找的是:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    2    1    3
[2,]    2    1    3    2    1
[3,]    1    3    2    1    3
[4,]    2    1    3    2    1

在此先感谢您的帮助!

4

2 回答 2

3

您正在寻找%in%.

> x[x[,1] %in% y, ]

#     [,1] [,2] [,3] [,4] [,5]
# [1,]    1    3    2    1    3
# [2,]    2    1    3    2    1
# [3,]    1    3    2    1    3
# [4,]    2    1    3    2    1

正如@Ricardo 在评论中所说,更好地解释为什么会发生这种情况。当你等于x[,1]y,你得到:

x[,1] == y
[1]  TRUE  TRUE FALSE FALSE FALSE

因为y1,2只是等同于x[, 1]并且因为它们都匹配,所以返回 TRUE。由于输出的长度必须等于length(x[, 1]),其余部分被“回收”(y = 1, 2, 1 对 x = 3, 1, 2),结果为 FALSE。但是现在,如果您用于x[., ]获取行,则只有前两个值是 TRUE。所以,只有前两个会被选中。使用 `%in% 会导致:

x[,1] %in% y
# [1]  TRUE  TRUE FALSE  TRUE  TRUE

这是你所期望的。

于 2013-03-06T19:03:49.763 回答
1

为了补充@Arun的答案,如果要比较的两个向量的大小不同,R回收较短的向量,以便R比较两个相同大小的向量,然后进行成对比较。(即比较每个向量的第一个元素,然后比较eac向量的第二个元素,等等)。

例如,它不会将向量 1 的第一个元素与向量 2 中的所有元素进行比较。(因为你需要%in%@Arun提到的)

例如,看看下面的内容。前两个示例产生等效输出

> c(0, 1, 2, 0, 1, 2) == c(1, 2)
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE

> c(0, 1, 2, 0, 1, 2) == c(1, 2, 1, 2, 1, 2)
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE

The comparisons being made are:

 #  element#   LHS     RHS   areEqual
 #     1.       0       1      FALSE   <~~ Notice that the '0' from LHS is being compared with the '1' from RHS
 #     2.       1       2      FALSE  
 #     3.       2       1      FALSE
 #     4.       0       2      FALSE
 #     5.       1       1       TRUE
 #     6.       2       2       TRUE

这是另一个示例,LHS 相对于前一个示例“移动”。

> c(1, 2, 0, 1, 2, 0) == c(1, 2)
[1]  TRUE  TRUE FALSE FALSE FALSE FALSE

注意当较短的向量不是较长元素的精确倍数时会发生什么。(即,2 不进入 7)。
循环仍然发生,但较短的向量的一部分从上次循环中被裁剪。
R给我们一个警告,以防万一我们没想到它们的大小不同

> c(1, 2, 3, 4, 1, 2, 0) == c(1, 2)
[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE
Warning message:
In c(1, 2, 3, 4, 1, 2, 0) == c(1, 2) :
  longer object length is not a multiple of shorter object length

请注意,较长的向量是在 RHS 还是 LHS 上并不重要;回收工作是一样的

> c(1, 2) == c(1, 2, 0, 1, 2, 0)
[1]  TRUE  TRUE FALSE FALSE FALSE FALSE
于 2013-03-06T20:37:23.737 回答