【问题标题】:dplyr and group_by: factor vs no factordplyr 和 group_by:因素与无因素
【发布时间】:2014-07-03 13:29:01
【问题描述】:

所描述的行为是一个错误!

我不明白group_by 对作为一个因素的列的影响,而那些不是。下面分析这两种可能性:

library(dplyr)

df <- data.frame(value=seq(1,10), height=c(rep(1,5),rep(2,5)))

# height is no factor
dfs <- df %>% group_by(height) %>% summarize(m=mean(value))
dfs$height==dfs$height[1]

# height is factor
df$height <- as.factor(df$height)
dfs <- df %>% group_by(height) %>% summarize(m=mean(value))

这里是一个数据框

   value height
1      1      1
2      2      1
3      3      1
4      4      1
5      5      1
6      6      2
7      7      2
8      8      2
9      9      2
10    10      2

按高度汇总。当df$height 不是因素时,结果如下所示:

  height        m
1      1 4.500000
2      1 3.000000
3      1 2.000000
4      1 1.000000
5      2 9.000000
6      2 6.000000
7      2 8.333333

如果df$height 是一个因素,那么结果就是我想要的:

  height m
1      1 3
2      2 8

为什么会发生这样的事情?我的第一个猜测是这是一个数字问题,非因素heights 差异非常小。但是,上面的测试表明所有height==1 都是相等的:

> dfs$height==dfs$height[1]
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE

好吧,我可以只使用因子,但这样我就失去了高度的数字字符。比如我想按高度排序或者选择最高的高度。

【问题讨论】:

  • 无法复现,你用的是最新版的dplyr - 0.2吗?
  • @James 我使用的是最新版本 0.2,但使用的是 R 3.0.3。在另一台带有R 3.1.0 的机器上,我也无法重现它。我将在第一台机器上测试更新的R
  • @James 问题仍然存在于一台带有R 3.1.0 的机器上。所以问题必须来自更深层次的组件。该软件相当旧(例如 gcc 4.3.2)。一般来说,没有因素的第一个版本应该工作吗?还是取决于机器?
  • 这很奇怪。我唯一能想到的是,高度变量值接近 1,但由于计算过程中的数值精度误差而略有不同。为什么它发生在一台机器上而不是另一台机器上可能是由于如何处理这些数字错误。这是一个可重现的示例 data.frame:x &lt;- data.frame(value=1:3,height=c(0.3,0.1+0.2,0.4))
  • @James 我也想到了这一点,所以我在上面的R 中进行了相等测试。显然,R 级别的高度相等,但dplyr 也使用的C++ 例程中的高度不同。您的示例很好地表明在group_by 中使用浮点值可能不是一个好主意。使用as.factor 转换高度似乎可以检查小的数值差异,因此相同的级别适用于0.30.1+0.2

标签: r dplyr


【解决方案1】:

根据我对group_by 的理解,它适用于任何变量类型,而不仅仅是因子。基于https://github.com/tidyverse/dplyr/issues/482 和我自己的重现尝试,这个问题应该被关闭。

【讨论】:

  • 是的,这种行为是一个错误。
  • 为什么我仍然收到以下错误消息:'UseMethod(“group_by_”)错误:'group_by_'没有适用的方法应用于“因子”类的对象'(我更新了所有包和 R 版本)
猜你喜欢
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多