R中的子集使用%in%= == operator返回不同的值

时间:2015-12-27 06:33:31

标签: r subset

我是R的新手,并学习了几种分组数据的方法。我很困惑,在邮政编码设置的餐厅数据(RestData)中使用以下匹配数量的差异。

> nrow(restData[restData$zipCode %in% c("21212","21213"),])
# [1] 59
> nrow(restData[restData$zipCode == c("21212","21213"),])
# [1] 26

>Warning message:
In restData$zipCode == c("21212", "21213") :
 longer object length is not a multiple of shorter object length

我正在使用以下数据集,以防您想要复制

fileURL <- "https://data.baltimorecity.gov/api/views/k5ry-ef3g/rows.csv?accessType=DOWNLOAD"
download.file(fileURL, destfile = "./Rdata/restaurants.csv", method = "curl")
restData <- read.csv("./Rdata/restaurants.csv")

1 个答案:

答案 0 :(得分:2)

你没有得到相同的答案,因为两条线都没有做同样的事情!如果您要对邮政编码为RestData"21212"的{​​{1}}的排名进行索引,则第一个是正确的。有关详细信息,请参阅"21213"

在第二行中,重要的是要知道R将在二进制操作需要时“回收”较短向量的元素。例如,?"%in%"将循环第二个向量(长度为2)以使其成为长度为6的向量,因此您确实1:6 + 1:2。在你的情况下,你正在做

1:6 + rep(1:2, length=6)

比较是逐个元素完成的。所以,它告诉你奇数位置是restData$zipCode == rep(c("21212", "21213"), length=nrow(restData)) 还是偶数位置是"21212"。你得到的警告很重要,因为它告诉你将奇数长度的矢量与偶数长度的矢量进行比较。在某些情况下,回收可能很有用,例如"21213"将仅检索奇数位置。