我有一个包含以下格式的数据框:

manufacturers pricegroup leads
harley        <2500      #
honda         <5000      #
...           ...        ..


我正在使用聚合函数以以下方式提取数据:

aggregate( leads ~ manufacturer + pricegroup, data=leaddata,
    FUN=sum, subset=(manufacturer==c("honda","harley")))


我注意到这没有返回正确的总数。我添加到子集组的制造商越多,每个制造商的数量就越小。但是,如果我使用:

aggregate( leads ~ manufacturer + pricegroup, data=leaddata,
    FUN=sum, subset=(manufacturer=="honda" | manufacturer=="harley"))


它返回正确的数字。对于我的一生,我不知道为什么。我将使用OR运算符,除了我将动态传递制造商列表。关于第一个构造为何不起作用的任何想法?更好的是,关于如何使它起作用的任何想法?谢谢!

最佳答案

问题是==在“ honda”和“ harley”的值之间交替,并与“ manufacturer”变量的相关位置中的值进行比较。另一方面,%in%(由MrFlick建议)和|在确定要标记的值之前检查整个“ manufacturer”变量。

==将值循环到要比较的长度。

通过一个示例可能更容易看到:

set.seed(1)
v1 <- sample(letters[1:5], 10, TRUE)
v2 <- c("a", "b")   ## Will be recycled to rep(c("a", "b"), 5) when comparing with v1

data.frame(v1, v2,
           `==` = v1 == v2,
           `%in%` = v1 %in% v2,
           `|` = v1 == "a" | v1 == "b",
           check.names = FALSE)
#    v1 v2    ==  %in%     |
# 1   b  a FALSE  TRUE  TRUE
# 2   b  b  TRUE  TRUE  TRUE
# 3   c  a FALSE FALSE FALSE
# 4   e  b FALSE FALSE FALSE
# 5   b  a FALSE  TRUE  TRUE
# 6   e  b FALSE FALSE FALSE
# 7   e  a FALSE FALSE FALSE
# 8   d  b FALSE FALSE FALSE
# 9   d  a FALSE FALSE FALSE
# 10  a  b FALSE  TRUE  TRUE


请注意,在==列中,唯一的TRUE值是“ v1”和“ v2”的回收值相同的地方。

10-05 22:33