53

我有数据框dih_y2。这两行给了我一个警告:

> memb = dih_y2$MemberID[1:10]
> dih_col = which(dih_y2$MemberID == memb)  
Warning message:
In dih_y2$MemberID == memb :
longer object length is not a multiple of shorter object length

为什么?

4

4 回答 4

91

您没有给出可重现的示例,但您的警告消息可以准确地告诉您问题所在。

memb只有长度为 10。我猜长度dih_y2$MemberID不是 10 的倍数。使用时==,如果不是倍数,R 会发出警告,让你知道它可能没有做你正在做的事情期待它做到。==逐元素检查是否相等。我怀疑您想要做的是找到 的哪些元素dih_y2$MemberID也在 vector 中memb。为此,您需要使用%in%运算符。

dih_col <- which(dih_y2$MemeberID %in% memb)
于 2012-06-02T19:13:53.047 回答
32

当您在 R 中对两个向量进行布尔比较时,“期望”是两个向量的长度相同,以便 R 可以依次比较每个对应的元素。

R 有一个非常受欢迎(或讨厌)的功能,称为回收,在许多情况下,如果您尝试执行 R 通常期望对象具有相同长度的操作,它会自动扩展或回收较短的对象以强制两者物体长度相同。

如果较长的对象是较短的对象的倍数,这相当于简单地重复较短的对象几次。通常,R 程序员会利用这一点来更紧凑地做事并减少打字。

但是,如果它们不是倍数,R 会担心您可能犯了错误,并且可能并不打算执行该比较,因此会发出警告。

使用以下代码探索自己:

> x <- 1:3
> y <- c(1,2,4)
> x == y
[1]  TRUE  TRUE FALSE
> y1 <- c(y,y)
> x == y1
[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE
> y2 <- c(y,2)
> x == y2
[1]  TRUE  TRUE FALSE FALSE
Warning message:
In x == y2 :
  longer object length is not a multiple of shorter object length
于 2012-06-02T19:15:12.850 回答
10

我有一个类似的问题,使用%in%运算符而不是==(平等)运算符是解决方案:

# %in%

希望能帮助到你。

于 2019-10-17T06:01:40.693 回答
0

我有一个类似的问题,但它与对象的结构和类有关。我会检查如何dih_y2$MemberID格式化。

于 2019-06-22T16:42:51.917 回答