我刚刚开始使用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版本等等。
感谢您的帮助!
答案 0 :(得分:0)
它似乎可以与dplyr
,0.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