【问题标题】:dplyr bug with data.table backend [in dplyr 0.4.3 or earlier]带有 data.table 后端的 dplyr 错误 [在 dplyr 0.4.3 或更早版本中]
【发布时间】:2015-09-14 16:18:03
【问题描述】:

当我浏览here 的答案时,我发现this solutiondata.frame 完全一样。

library(dplyr) # dplyr_0.4.3  
library(data.table) # data.table_1.9.5 
df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L), 
                     a = c("AA", 
                           "AB", "AA", "AB", "AB", "AB", "AB", "AA", "AA"), b = c(2L, 5L, 
                                                                                  1L, 2L, 4L, 4L, 3L, 1L, 4L)), .Names = c("id", "a", "b"),
                class = "data.frame", row.names = c(NA, -9L))


df %>%
  group_by(id) %>%
  mutate(relevance=+(a!='AA')) %>%
  mutate(mean=cumsum(relevance * b) / cumsum(relevance))

 Source: local data frame [9 x 5]
Groups: id [3]

     id     a     b relevance  mean
  (int) (chr) (int)     (int) (dbl)
1     1    AA     2         0   NaN
2     1    AB     5         1   5.0
3     1    AA     1         0   5.0
4     2    AB     2         1   2.0
5     2    AB     4         1   3.0
6     3    AB     4         1   4.0
7     3    AB     3         1   3.5
8     3    AA     1         0   3.5
9     3    AA     4         0   3.5

但是,当使用data.table 运行时,结果超出了我的理解范围。

setDT(df) %>%
  group_by(id) %>%
  mutate(relevance=+(a!='AA')) %>%
  mutate(mean=cumsum(relevance * b) / cumsum(relevance))

Source: local data table [9 x 5]

     id     a     b relevance     mean
  (int) (chr) (int)     (int)    (dbl)
1     1    AA     2         0      NaN
2     1    AB     5         1 5.000000
3     1    AA     1         0 5.000000
4     2    AB     2         1 3.500000
5     2    AB     4         1 3.666667
6     3    AB     4         1 3.750000
7     3    AB     3         1 3.600000
8     3    AA     1         0 3.600000
9     3    AA     4         0 3.600000

这是预期的行为吗?如果是这样,是否有关于何时不将data.table 后端与dplyr 一起使用的指南?

【问题讨论】:

  • 我认为你不需要两个 mutate 这里 setDT(df) %&gt;% group_by(id) %&gt;% mutate(relevance=+(a!='AA'), Mean= cumsum(relevance*b)/cumsum(relevance)) 按预期工作。我认为发生的事情是在第一个mutate 之后,分组由于某种奇怪的原因而消失了,现在,它正在使用未分组的cumsum
  • 查看第 5 行,不应该cumsum(relevance * b) / cumsum(relevance)) = ([4*1] + [2*1] + [5*1])/(3) = 11/3 = 3.666667,即data.table 答案?
  • 这可能是一个混淆分组的错误。一般来说,不需要第二次变异。
  • @ExperimenteR 好的,谢谢,完成。也许是我写过的最短的答案。

标签: r data.table dplyr


【解决方案1】:

导致分组在 data.table was resolved in 0.5.0 上的 mutate 之后被删除的错误。

【讨论】:

  • 可能值得一提的是,该错误已被关闭。
  • @Zag 谢谢。编辑了问题和答案。
猜你喜欢
  • 2021-08-25
  • 1970-01-01
  • 2014-02-20
  • 2014-02-03
  • 2019-07-04
  • 2023-03-24
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多