0
x1 = c(1,2,3,4,5,6,7)
x1
[1] 1 2 3 4 5 6 7
x1[which(x1== c(5,6))]
[1] 5 6
Warning message:
In x1 == c(5, 6) :
longer object length is not a multiple of shorter object length

当我退出 R 然后重新打开 RI 得到这个:

x1 = c(1,2,3,4,5,6,7)   
x1
[1] 1 2 3 4 5 6 7
x1[which(x1== c(5,6))]
[1] 5 6

警告消息消失。为什么?

4

1 回答 1

2

这里有几点需要注意:

您应该收到该消息,因为正是它所说的原因 - 较长项目的长度不是较短项目长度的倍数。这意味着您认为自己在做的事情可能不是您实际在做的事情。每次尝试运行该代码时,您都应该收到此消息 - 我不知道为什么您在运行它时不会收到该消息。

您可以使用逻辑值对向量进行索引,因此这里不需要使用 which。

您最有可能在%in%运算符中寻找什么。您当前正在做的是逐个元素比较相等性,较短的向量将自行“回收”,直到它与较长的向量具有相同的长度。例如:

x1 <- c(1, 2)
x2 <- c(1, 2, 3, 4)
x1 == x2
#[1]  TRUE  TRUE FALSE FALSE

这样做是针对 x2[1] 测试 x1[1],然后针对 x2[2] 测试 x1[2],然后由于 x1 中没有更多元素,它循环回到开头并针对 x2 测试 x1[1] [3],然后是 x1[2] 对 x2[4]。

相反,如果我们只是想找出 x1 的哪些元素在向量 x2 中,那么如前所述,%in%运算符会为我们处理这些问题:

x1 %in% x2
#[1] TRUE TRUE

这是在问 x1[1] 是 x2 的一个元素吗?x1[2] 是 x2 的元素吗?等等等等...

于 2012-09-23T02:40:28.763 回答