ddply具有用户定义的功能

时间:2014-12-21 04:48:31

标签: r plyr reshape2

我想知道如何使用ddply来调用多个用户定义的函数。目前的解决方案:

require(plyr)
data(mtcars)
#MY UDF
carTest<-function(cars){
    dratCut= max(cars$drat)
    mpgCut = max(cars$mpg)
    best = subset(cars, cars$drat< dratCut & cars$mpg < mpgCut)
    return (best$hp) 
 }

 x= ddply(mtcars, .(cyl,gear), function(mtcars.sub) mean(carTest(mtcars.sub)))
 y = ddply(mtcars, .(cyl,gear), function(mtcars.sub) sd(carTest(mtcars.sub)))
 final = cbind(x, y$V1)

我希望ddply将我的数据帧拆分为多个数据帧,在拆分时调用UDF,并计算返回值的统计信息。 我目前的解决方案是通过两次调用ddply(和carTest)来实现这一目的。

有更好的方法吗?我已经简化了UDF以使代码更简单,因此将UDF分解并不理想。

1 个答案:

答案 0 :(得分:0)

你可以尝试

library(dplyr)
late %>%
      group_by(elapsed, CreditGrade)%>%
      summarise_each(funs(mean=mean(., na.rm=TRUE),
                         sd=sd(., na.rm=TRUE) , median=median(., na.rm=TRUE)))

使用mtcars数据集

data(mtcars)
mtcars$wt[c(3,5)] <- NA
mtcars %>% 
     group_by(gear) %>% 
     summarise_each(funs(mean=mean(., na.rm=TRUE),
                     sd=sd(., na.rm=TRUE)), wt, qsec)
#   gear  wt_mean qsec_mean     wt_sd  qsec_sd
#1    3 3.924929    17.692 0.8546165 1.349916
#2    4 2.643636    18.965 0.6562739 1.613880
#3    5 2.632600    15.640 0.8189254 1.130487

或使用aggregate

do.call(`data.frame`,aggregate(cbind(wt,qsec)~gear,mtcars,
        FUN=function(x) c(mean=mean(x, na.rm=TRUE), 
                       sd=sd(x, na.rm=TRUE)), na.action=NULL))
#  gear  wt.mean     wt.sd qsec.mean  qsec.sd
#1    3 3.924929 0.8546165    17.692 1.349916
#2    4 2.643636 0.6562739    18.965 1.613880
#3    5 2.632600 0.8189254    15.640 1.130487

更新

关于在multiple中使用ddply用户定义的函数,而不是两次调用ddply,您可以在第一次调用中使用ccbind < / p>

 res <- ddply(mtcars, .(cyl,gear), function(mtcars.sub) 
               c(mean(carTest(mtcars.sub)), sd(carTest(mtcars.sub))))

 res
 #  cyl gear        V1       V2
 #1   4    3       NaN       NA
 #2   4    4  81.83333 19.65112
 #3   4    5       NaN       NA
 #4   6    3 105.00000       NA
 #5   6    4       NaN       NA
 #6   6    5       NaN       NA
 #7   8    3 191.00000 31.95483
 #8   8    5 335.00000       NA