绑定R中多个列表的相应数据框元素(使用gapply for function)

时间:2016-12-23 15:52:25

标签: r list function rbind mapply

我有一个输出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有更好的方法来按组应用函数然后合并数据框,我也欢迎!)感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我得到了它的工作!我确信有一种更优雅的方式可以做到这一点,但以下似乎可以完成这项工作:

Reduce(function(x,y) Map(rbind, x, y),gapply(df, groups=df$variable, FUN=tfunction))