我想知道如何使用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分解并不理想。
答案 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
,您可以在第一次调用中使用c
或cbind
< / 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