为什么我得到"警告更长的物体长度不是较短物体长度的倍数"?

ash*_*him 34 r

我有dataframe 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
Run Code Online (Sandbox Code Playgroud)

为什么?

Das*_*son 66

您没有提供可重现的示例,但您的警告消息会准确地告诉您问题所在.

memb只有10的长度.我猜dih_y2的长度$ MemberID不是10的倍数.当使用==时,如果它不是倍数就会吐出警告,让你知道它可能是没有做你期望它做的事情.==按元素检查是否相等.如果发现哪些元素dih_y2$MemeberID也在向量中,我怀疑你想做什么memb.为此,您需要使用%in%运算符.

dih_col <- which(dih_y2$MemeberID %in% memb)
Run Code Online (Sandbox Code Playgroud)


jor*_*ran 26

当你在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
Run Code Online (Sandbox Code Playgroud)


小智 7

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

# %in%
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。