2017-09-21 14 views
1

2つのリストを持ち、1つはIDを含み、もう1つのデータは2つの列を持つ18のデータフレームを持ちます。私の目標は、結果として得られた18のデータフレーム(リストに再度格納される)がそれぞれ3つの列を持つように、両方のリストのデータフレーム(list1の最初のものとlist2の最初のものなど) (1つのID列、2つのデータ列)。 list1でのデータフレームが必ずしもlist2でのものと同じ長さを持っていないこと、およびlist1におけるデータフレームのデータ列が異なっlist2で1より命名されていることを結合されたデータフレームで3番目のリストを取得するデータフレームの2つのリストを結合するにはどうすればよいですか?

Plesaeノート。

list1 <- list(df1 = data.frame(id_col = c(1:3), data_1 = letters[1:3]), 
       df2 = data.frame(id_col = c(1:4), data_1 = letters[1:4])) 
list2 <- list(df1 = data.frame(id_col = c(1:4), data_2 = LETTERS[1:4]), 
       df2 = data.frame(id_col = c(1:7), data_2 = LETTERS[1:7])) 

私が推測するソリューションは、このような何かを行く:ここ

は小型化の例であるあなたは、フル参加したい場合

mapply(function(x, y) { 
    # some function with e. g. dplyr::full_join 
    }, x = list1, y = list2) 

答えて

2
list3 <- lapply(1:length(list1), 
       function(x) merge(list1[[x]], 
            list2[[x]], 
            by = "id_col")) 
list3 
# [[1]] 
# id_col data_1 data_2 
# 1  1  a  A 
# 2  2  b  B 
# 3  3  c  C 
# 
# [[2]] 
# id_col data_1 data_2 
# 1  1  a  A 
# 2  2  b  B 
# 3  3  c  C 
# 4  4  d  D 

は、指定all = TRUE

list3 <- lapply(1:length(list1), 
       function(x) merge(list1[[x]], 
            list2[[x]], 
            by = "id_col", 
            all = TRUE)) 
list3 
# [[1]] 
# id_col data_1 data_2 
# 1  1  a  A 
# 2  2  b  B 
# 3  3  c  C 
# 4  4 <NA>  D 
# 
# [[2]] 
# id_col data_1 data_2 
# 1  1  a  A 
# 2  2  b  B 
# 3  3  c  C 
# 4  4  d  D 
# 5  5 <NA>  E 
# 6  6 <NA>  F 
# 7  7 <NA>  G 
2

' purrr::map2 :)のためのSAの仕事を:

map2(list1,list2,~merge(.x,.y)) 

# $df1 
# id_col data_1 data_2 
# 1  1  a  A 
# 2  2  b  B 
# 3  3  c  C 
# 
# $df2 
# id_col data_1 data_2 
# 1  1  a  A 
# 2  2  b  B 
# 3  3  c  C 
# 4  4  d  D 

(希望参加の種類を取得するために、マージのパラメータを調整)

1

私はこれを行うような方法は、リストをループするpurrrdplyrにしています接合を行う。

list1 <- list(df1 = data.frame(id_col = c(1:3), data_1 = letters[1:3]), 
       df2 = data.frame(id_col = c(1:4), data_1 = letters[1:4])) 
list2 <- list(df1 = data.frame(id_col = c(1:4), data_2 = LETTERS[1:4]), 
       df2 = data.frame(id_col = c(1:7), data_2 = LETTERS[1:7])) 

purrr::map2(list1, list2, dplyr::full_join, by = "id_col") 
#> $df1 
#> id_col data_1 data_2 
#> 1  1  a  A 
#> 2  2  b  B 
#> 3  3  c  C 
#> 4  4 <NA>  D 
#> 
#> $df2 
#> id_col data_1 data_2 
#> 1  1  a  A 
#> 2  2  b  B 
#> 3  3  c  C 
#> 4  4  d  D 
#> 5  5 <NA>  E 
#> 6  6 <NA>  F 
#> 7  7 <NA>  G 

MAP2反復を等しい長さの2つのリストを介して、目で関数にこれらのリストのn番目の要素を通過します3番目の引数。 4番目の引数も関数に渡されます。

関連する問題