dplyr 0.4.3或更早版本中,使用data.table后端存在bug

4

当我浏览这里的答案时,我发现这个解决方案data.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

这是一种预期的行为吗?如果是,那么有没有什么指导方针可以告诉我们何时不应该使用dplyrdata.table后端呢?


1
我认为你不需要在这里使用两个 mutatesetDT(df) %>% group_by(id) %>% mutate(relevance=+(a!='AA'), Mean= cumsum(relevance*b)/cumsum(relevance)) 可以正常工作。我认为问题出在第一个 mutate 之后,由于某种奇怪的原因,分组被取消了,现在正在使用未分组的 cumsum - akrun
1
看第5行,cumsum(relevance * b) / cumsum(relevance)) = ([4*1] + [2*1] + [5*1])/(3) = 11/3 = 3.666667,不应该是data.table的答案吗? - Akhil Nair
1
可能是一个错误导致了分组混乱。通常情况下,不需要第二个 mutate。 - akrun
4
这里是链接:https://github.com/hadley/dplyr/issues/919。 - Frank
1
@ExperimenteR 好的,谢谢,完成了。也许这是我写过的最短的答案。 - Frank
显示剩余5条评论
1个回答

4
在data.table上进行mutate操作后导致分组被删除的错误在0.5.0版本中已得到解决。 (参考链接)

值得一提的是,该漏洞已被关闭。 - Zag
@Zag 谢谢。已编辑问题和答案。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接