我有数据帧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
为什么?
答案 0 :(得分:56)
您没有提供可重现的示例,但您的警告消息会准确地告诉您问题所在。
memb只有10的长度。我猜dih_y2的长度$ MemberID不是10的倍数。当使用==时,如果它不是倍数就会吐出警告让你知道它可能没有做你期望它做的事情。 ==按元素检查是否相等。如果找到dih_y2$MemeberID
的哪些元素也在向量memb
中,我怀疑你想要做什么。为此,您需要使用%in%
运算符。
dih_col <- which(dih_y2$MemeberID %in% memb)
答案 1 :(得分:19)
当你在R中的两个向量之间执行布尔比较时,“期望”是两个向量具有相同的长度,因此R可以依次比较每个对应的元素。
R有一个非常受欢迎(或讨厌)的功能,称为recycling,在许多情况下,如果你试图做一些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
答案 2 :(得分:1)
我遇到了类似的问题,并且使用%in%
运算符而不是==
(等于)运算符是解决方案:
# %in%
希望有帮助。
答案 3 :(得分:0)
我有一个类似的问题,但这与对象的结构和类有关。我将检查dih_y2$MemberID
的格式。