簡體   English   中英

使用R合並兩個數據幀列表

[英]Merging two lists of dataframes using R

我想根據一個常見的id變量合並兩個數據幀列表,請考慮以下示例

set.seed(1)
mylist1=data.frame(id=sample(paste0("id",sample(1:5,10,T))),var1=sample(letters[1:26],10,T),stringsAsFactors=F);mylist1=split(mylist1,mylist1$id)
set.seed(2)
mylist2=data.frame(id=sample(paste0("id",sample(1:5,10,T))),var2=sample(LETTERS[1:26],10,T),stringsAsFactors=F);mylist2=split(mylist2,mylist2$id)

mylist1
# $id1
# id     var1
# id1    d
# 
# $id2
# id     var1
# id2    f
# id2    g
# id2    w
# etc.

mylist2
# $id1
# id     var2
# id1    V
# id1    D
# id1    J
# 
# $id3
# id     var2
# id3    K
# id3    J
# id3    Z
# etc.

數據框的結果列表應如下所示

# $id1
# id  var1 var2
# id1 d    V
# id1 d    D
# id1 d    J

# $id2
# id  var1 var2
# id2 f    NA
# id2 g    NA
# id2 w    NA
# etc.

妳知道我該怎么做嗎?

我們可以使用Map來做到這一點。 從示例數據集中可以看出,只有某些list元素是兩者共有的(基於列表元素的名稱)。

我們的第一步是使用union獲得每個list所有unique名稱。 我們使用這些名稱('nm1')將第一個('lst1')和第二個list ('lst2')進行子集化。 如果缺少元素,則該位置將為NULL元素。

nm1 <- union(names(mylist1), names(mylist2))
lst1 <- mylist1[nm1]
lst2 <- mylist2[nm1]

現在,我們通過為該位置創建一個“ data.frame”來更改每個listNULL值。 我們可以使用if/elselapply循環上執行此lapply

lst1 <- lapply(lst1, function(x) if(is.null(x)) 
                         data.frame(id=NA, var1=NA) else x)
lst2 <- lapply(lst2, function(x) if(is.null(x))
                        data.frame(id=NA, var2=NA) else x)

之后,我們可以使用Map merge兩個lists lists中的相應元素被merge d。 除了使用匿名函數,我們還可以使用MoreArgs來指定merge可能需要的額外參數。

Map(merge, lst1, lst2,MoreArgs=list(by='id', all=TRUE))
#$id1
#   id var1 var2
#1 id1    d    V
#2 id1    d    D
#3 id1    d    J

#$id2
#    id var1 var2
#1  id2    f   NA
#2  id2    g   NA
#3  id2    w   NA
#4 <NA> <NA>   NA

#$id3
#   id var1 var2
#1 id3    y    K
#2 id3    y    J
#3 id3    y    Z

#$id4
#   id var1 var2
#1 id4    a    D
#2 id4    i    D

#$id5
#   id var1 var2
#1 id5    q    R
#2 id5    q    M
#3 id5    q    D
#4 id5    k    R
#5 id5    k    M
#6 id5    k    D
#7 id5    j    R
#8 id5    j    M
#9 id5    j    D

暫無
暫無

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

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