【问题标题】:Unexpected behavior in subsetting aggregate function in RR中子集聚合函数的意外行为
【发布时间】:2015-04-26 03:28:16
【问题描述】:

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

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 运算符,但我将动态传递制造商列表。关于为什么第一个构造不起作用的任何想法?更好的是,关于如何使它工作的任何想法?谢谢!

【问题讨论】:

  • == 是错误的运算符。使用%in%。例如:subset=manufacturer %in% c("honda","harley")
  • 啊哈!那成功了。那么 == 到底在做什么呢?
  • 交替检查值,而不是检查整个集合。

标签: r logic aggregate subset


【解决方案1】:

问题在于== 在“honda”和“harley”的值之间交替,并与“制造商”变量的相关位置的值进行比较。另一方面,%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

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

【讨论】:

  • 感谢您的详细解释。现在,当我将更多制造商添加到列表中时,为什么数字会持续下降,这完全可以理解。
猜你喜欢
  • 2014-11-10
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2017-02-13
  • 2015-06-06
  • 2018-06-15
相关资源
最近更新 更多