R:使用lapply与数据框架和自定义功能

时间:2015-08-12 17:09:04

标签: r dataframe lapply

我有一个关于将lapply与数据框列表一起使用的问题。假设我有两个列表:

 list1<-list(data1,data2)
 list2<-list(data3,data4)

我想编写一个函数,将一个数据帧中的列和行附加到另一个数据框。这是我的功能:

append<-function(origin.data, destin.data){

vec.to.append<-origin.data[,1]

#add as the first column
destin.data<-cbind(vec.to.append, destin.data)

#add as first row
vec.to.append<-t(c(0, vec.to.append))
destin.data<-rbind(vec.to.append, destin.data)

return(destin.data)
}

如果我运行

,这样可以正常工作
append(list1[[1]], list2[[1]])

append(list1[[2]], list2[[2]])

但是当我尝试使用lapply时出现错误:

trial<-lapply(list1, append, destin.data=list2)

错误看起来很简单:

Error in rbind(vec.to.append, destin.data) : number of columns of matrices must match (see arg 2)

但是当我检查数据框和矢量的尺寸时,一切看起来都很好。另外,如果我不使用lapply但是通过参数“参数化”,该函数运行并给出预期结果。有人可以帮助我吗?

顺便说一下,我在这里看到了答案:Using lapply with changing arguments但是在列表名称上应用我的函数会得到一个空结果:

prova<-lapply(names(list1), append, destin.data=list2)

prova
list()

显然,我错过了一些东西!

2 个答案:

答案 0 :(得分:0)

lapply(list1, append, destin.data=list2)相当于:

list(append(list1[[1]], list2),
     append(list1[[2]], list2)

这不是你想要的。如果你想按顺序配对list1和list2,你应该这样做:

lapply(seq_along(list1), function(i) append(list1[[i]], list2[[i]])

这相当于:

list(append(list1[[1]], list2[[1]]),
     append(list1[[2]], list2[[2]])

这就是你想要的,对吗?

编辑:正如另一个答案所说,您也可以使用mapply,这有点整洁,但这是基于lapply的解决方案。在任何一种情况下结果都是相同的。

答案 1 :(得分:0)

lapply仅迭代一个列表。您传递的最后一个参数将按原样传递给函数(即函数append传递所有list2而不是仅传递一个元素。

您可以改用Mapmapply。请注意,与lapply相比,此处参数的顺序相反:

result = Map(append, list1, list2)