在group_by之后的dplyr mutate中的列上的函数未给出正确的分组结果

时间:2016-03-24 05:23:26

标签: r dplyr

我刚刚开始使用dplyr并且已经将我的一些plyr代码转换过来了。我喜欢新的语法,但是我无法让mutate()在逐个列上应用函数,例如:

library(Hmisc)
library(plyr)
library(dplyr)

t1 <- ddply(mtcars, .(cyl), transform, qrt=cut2(wt, g=4))  
levels(t1$qrt)  # works: different quartiles for each group

t2 <- mtcars %>% group_by(cyl) %>% mutate(qrt=cut2(wt, g=4))  
levels(t2$qrt)   # doesn't work: uses only 4 quartiles from the first group

起初我认为第二个示例是使用整个wt列而不是cyl组,但它实际上似乎只使用第一组的四分位数并将它们分配给所有即使wt落在范围之外,这些群体也是如此。

我是否错过了mutate函数内wt引用的一些语法?我可以让ddply版本适用于像sum()这样的函数,那么cut2()会导致问题吗?

我已经阅读了很多关于类似问题的帖子,并尝试在没有加载ddply的干净环境中运行dplyr版本等等。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

它似乎可以与dplyr0.8.3的最新版本一起使用。输出的数据帧显示每个cyl都有自己的范围集,并且每个bin中的最小值{max}和最大值wt都不在指定范围内。

remove.packages("dplyr") # Unecessary but proves that this is the latest deployment version
install.packages("dplyr")

packageVersion("dplyr")

# [1] ‘0.8.3’

library(Hmisc)
library(dplyr)

t2 <- mtcars %>% 
  group_by(cyl) %>% 
  mutate(qrt = cut2(wt, g=4))

t2 %>%
  group_by(cyl, qrt) %>%
  summarize(min = min(wt), max = max(wt)) %>%
  arrange(cyl, qrt)

# A tibble: 12 x 4
# Groups:   cyl [3]
#     cyl qrt           min   max
#   <dbl> <chr>       <dbl> <dbl>
# 1     4 [1.51,1.94)  1.51  1.84
# 2     4 [1.94,2.32)  1.94  2.2 
# 3     4 [2.32,3.15)  2.32  2.78
# 4     4 [3.15,3.19]  3.15  3.19
# 5     6 [2.62,2.88)  2.62  2.77
# 6     6 [2.88,3.44)  2.88  3.22
# 7     6 3.44         3.44  3.44
# 8     6 3.46         3.46  3.46
# 9     8 [3.17,3.57)  3.17  3.52
#10     8 [3.57,3.78)  3.57  3.73
#11     8 [3.78,5.25)  3.78  4.07
#12     8 [5.25,5.42]  5.25  5.42