[英]R: using lapply with data frames and custom function
我有一個關於將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
而是“逐個參數”地運行,該函數將運行並給出預期的結果。 有人可以幫我嗎?
順便說一句,我在這里看到了答案: 對變化的參數使用lapply,但對列表名稱應用我的函數將得到一個空結果:
prova<-lapply(names(list1), append, destin.data=list2)
prova
list()
顯然,我缺少了一些東西!
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
的解決方案。 在兩種情況下結果都是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.