我有数据框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
为什么?
我有数据框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
为什么?
您没有给出可重现的示例,但您的警告消息可以准确地告诉您问题所在。
memb
只有长度为 10。我猜长度dih_y2$MemberID
不是 10 的倍数。使用时==
,如果不是倍数,R 会发出警告,让你知道它可能没有做你正在做的事情期待它做到。==
逐元素检查是否相等。我怀疑您想要做的是找到 的哪些元素dih_y2$MemberID
也在 vector 中memb
。为此,您需要使用%in%
运算符。
dih_col <- which(dih_y2$MemeberID %in% memb)
当您在 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
我有一个类似的问题,使用%in%
运算符而不是==
(平等)运算符是解决方案:
# %in%
希望能帮助到你。
我有一个类似的问题,但它与对象的结构和类有关。我会检查如何dih_y2$MemberID
格式化。