在R中子集聚合函数的意外行为

在R中子集聚合函数的意外行为,r,logic,aggregate,subset,R,Logic,Aggregate,Subset,我有一个包含以下格式的数据框: manufacturers pricegroup leads harley <2500 # honda <5000 # ... ... .. 我注意到这并没有返回正确的总数。我添加到子集组中的制造商越多,每个制造商的数量就越小。但是,如果我使用: aggregate( leads ~ manufacturer + pricegroup, data=leaddata,

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

manufacturers pricegroup leads
harley        <2500      #
honda         <5000      #
...           ...        ..
我注意到这并没有返回正确的总数。我添加到子集组中的制造商越多,每个制造商的数量就越小。但是,如果我使用:

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

它返回正确的数字。就我个人而言,我不知道为什么。我只会使用OR操作符,除非我将动态传递制造商列表。关于第一个构造为什么不起作用有什么想法吗?更好的是,你有什么想法可以让它工作吗?谢谢

问题在于,
=
在“本田”和“哈雷”的值之间交替,并与“制造商”变量的相关位置的值进行比较。另一方面,
%in%
(根据MrFlick的建议)和
|
在决定标记哪些值之前检查整个“制造商”变量

=
会将值循环到所比较内容的长度

举例来说,这可能更容易看出:

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
set.seed(1)

v1
==
是错误的运算符。在%
中使用
%。例如:
子集=制造商在%c中的百分比(“本田”、“哈雷”)
啊哈!这就成功了。那么==到底在做什么呢?交替检查值,而不是在整个集合中检查。感谢您的详细解释。这就很好地解释了为什么当我将更多的制造商添加到列表中时,数量一直在减少。
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