【发布时间】: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,但使用的是
R3.0.3。在另一台带有R3.1.0 的机器上,我也无法重现它。我将在第一台机器上测试更新的R。 -
@James 问题仍然存在于一台带有
R3.1.0 的机器上。所以问题必须来自更深层次的组件。该软件相当旧(例如 gcc 4.3.2)。一般来说,没有因素的第一个版本应该工作吗?还是取决于机器? -
这很奇怪。我唯一能想到的是,高度变量值接近 1,但由于计算过程中的数值精度误差而略有不同。为什么它发生在一台机器上而不是另一台机器上可能是由于如何处理这些数字错误。这是一个可重现的示例 data.frame:
x <- 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.3和0.1+0.2。