我有一个输出3个数据帧列表的函数。作为一个玩具的例子:
tfunction<-function(x){
d1a<-data.frame(a=1*x$variable[1],b=2*x$variable[1])
d1b<-data.frame(c=letters[x$variable[1]],d=3*x$variable[1])
d1c<-data.frame(e=4*x$variable[1],f=letters[x$variable[1]])
l1<-list(d1a,d1b,d1c)
return(l1)
}
然后我想在我的数据集中的不同组中应用该功能。让我们在这个玩具示例中说我的数据框是:
df<-data.frame(variable=c(1,2,3),other=c(4,5,6))
我想要的输出是:
[[1]] a b
1 2
2 4
3 6
[[2]] c d
a 3
b 6
c 9
[[3]] e f
4 a
8 b
12 c
通常,当我的函数输出单个数据帧时,我通过以下方式执行此操作:
library(nlme)
do.call(rbind.data.frame, gapply(df, groups=df$variable, FUN=tfunction))
但是,因为我的函数输出是数据帧列表而不是单个数据帧,所以这不起作用。我知道我可以合并两个数据帧列表:
mapply(rbind, list1, list2)
但是,我无法弄清楚如何与gapply结合使用。我的尝试:
mapply(rbind, gapply(z, groups=z$variable, FUN=function))
导致所有数据帧被编译成单个列表。如何让R将每个相应的数据帧转换为3个数据帧的最终列表? (或者,如果有人比gapply有更好的方法来按组应用函数然后合并数据框,我也欢迎!)感谢您的帮助!
答案 0 :(得分:0)
我得到了它的工作!我确信有一种更优雅的方式可以做到这一点,但以下似乎可以完成这项工作:
Reduce(function(x,y) Map(rbind, x, y),gapply(df, groups=df$variable, FUN=tfunction))