簡體   English   中英

R:對數據框和自定義函數使用lapply

[英]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的解決方案。 在兩種情況下結果都是相同的。

lapply僅迭代一個列表。 您傳遞的最后一個參數按原樣傳遞給函數(即,函數append傳遞了整個list2而不是僅傳遞一個元素)。

您可以改用Mapmapply 請注意,此處的參數順序與lapply相比是相反的:

result = Map(append, list1, list2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM