我刚开始使用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
Run Code Online (Sandbox Code Playgroud)
起初我认为第二个例子是使用整个wt列而不是cyl组,但它实际上似乎只使用第一组的四分位数并将它们分配给所有组,即使在wt范围之外.
我是否错过了wtmutate函数内部引用的一些语法?我可以让ddply版本适用于像sum()这样的函数,所以有什么东西cut2()导致问题吗?
我已经阅读了很多关于可能类似问题的帖子,并尝试在没有ddply加载的干净环境中运行dplyr版本等等.
谢谢你的帮助!
它似乎可以与最新版本的dplyr,一起使用0.8.3。输出的数据帧显示每个数据框cyl都有自己的一组范围,并且每个箱中的最小值和最大值wt不超出规定的范围。
remove.packages("dplyr") # Unecessary but proves that this is the latest deployment version\ninstall.packages("dplyr")\n\npackageVersion("dplyr")\n\n# [1] \xe2\x80\x980.8.3\xe2\x80\x99\n\nlibrary(Hmisc)\nlibrary(dplyr)\n\nt2 <- mtcars %>% \n group_by(cyl) %>% \n mutate(qrt = cut2(wt, g=4))\n\nt2 %>%\n group_by(cyl, qrt) %>%\n summarize(min = min(wt), max = max(wt)) %>%\n arrange(cyl, qrt)\n\n# A tibble: 12 x 4\n# Groups: cyl [3]\n# cyl qrt min max\n# <dbl> <chr> <dbl> <dbl>\n# 1 4 [1.51,1.94) 1.51 1.84\n# 2 4 [1.94,2.32) 1.94 2.2 \n# 3 4 [2.32,3.15) 2.32 2.78\n# 4 4 [3.15,3.19] 3.15 3.19\n# 5 6 [2.62,2.88) 2.62 2.77\n# 6 6 [2.88,3.44) 2.88 3.22\n# 7 6 3.44 3.44 3.44\n# 8 6 3.46 3.46 3.46\n# 9 8 [3.17,3.57) 3.17 3.52\n#10 8 [3.57,3.78) 3.57 3.73\n#11 8 [3.78,5.25) 3.78 4.07\n#12 8 [5.25,5.42] 5.25 5.42\nRun Code Online (Sandbox Code Playgroud)\n