我刚开始使用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 mutate调用,其中我应用一个函数将一列作为参数来设置新列的值,不起作用?它似乎没有在正确的值上调用函数:新season列是根据列中的第一个值mon而不是其自己的行中的值来设置的.
# Function to return season (winter, summer, or transition) given numerical month
getSeason <- function(m) {
if(m >= 11 || m <= 3)
return(as.factor("Winter"))
if(m >= 5 && m <= 9)
return(as.factor("Summer"))
return(as.factor("Trans"))
}
getSeason(5) # Works: returns "Summer"
mon <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
months <- as.data.frame(mon)
months %>% mutate(season=getSeason(mon)) # doesn't work: all seasons set as "Winter"
Run Code Online (Sandbox Code Playgroud)
我正在使用R版本3.2.4和dplyr的最新开发版本.(这也不适用于最新版本的dplyr.)