2017-06-22 15 views
2

私はマージしたいデータフレームの2つの大きなリストを持っています。ここにデータのサンプルがあります。r:データフレームの2つのリストをマージする

私はこのような何かを得るために、「Wvlgth」で、リスト2の各データフレームをリスト1の各データフレームをマージしたい
list1 = list(data.frame(Wvlgth = c(337, 337.5, 338, 338.5, 339, 339.5), 
      Global = c(".9923+00",".01245+00", ".0005+00", ".33421E+00", ".74361+00", ".129342+00"), 
      group = c(0,0,0,0,0,0)), 
      data.frame(Wvlgth = c(337, 337.5, 338, 338.5, 339, 339.5), 
      Global = c(".1284+00",".0098+00", ".7853+00", ".2311+00", ".1211+00", ".75345+00"), 
      group = c(1,1,1,1,1,1))) 

list2 = list(data.frame(Wvlgth = c(337, 337.5, 338, 339), 
       time = c("13.445","13.445", "13.445", "13.445"), 
       IRD = c(.01324, .34565, .92395, .67489)), 
       data.frame(Wvlgth = c(337, 337.5, 338, 339), 
       time = c("13.45361","13.45361", "13.45361", "13.45361"), 
       IRD = c(.20981, .98703, .54092, .38567))) 

:のデータフレームので参加私はインナーを使用したい

Wvlgth time  IRD  Global  group 
337  13.445 0.01324 .9923+00  0 
337.5  13.445 0.34565 .01245+00  0 
338  13.445 0.92395 .0005+00  0 
339  13.445 0.67489 .74361+00  0 
337  13.45361 0.20981 .1284+00  1 
337.5  13.45361 0.98703 .0098+00  1 
338  13.45361 0.54092 .7853+00  1 
338.5  13.45361 0.38567 .2311+00  1 

をlist1はlist2のデータフレームと同じ数の行を持ちません。

this question,からdplyrを使用して回答を試みましたが、奇妙な方法でそれらをマージしてしまいました。何が起こったのかよく分かりません。それは垂直にではなく水平にマージされたようです...?

> c(list1, list2) %>% 
     Reduce(function(dtf1, dtf2) inner_join(dtf1, dtf2, by="Wvlgth"), .) 

    Wvlgth Global.x group.x Global.y group.y time.x IRD.x time.y 
1 337.0 .9923+00  0 .1284+00  1 13.445 0.01324 13.45361 
2 337.5 .01245+00  0 .0098+00  1 13.445 0.34565 13.45361 
3 338.0 .0005+00  0 .7853+00  1 13.445 0.92395 13.45361 
4 339.0 .74361+00  0 .1211+00  1 13.445 0.67489 13.45361 
    IRD.y 
1 0.20981 
2 0.98703 
3 0.54092 
4 0.38567 

答えて

1

あなたは同時に両方のリストをループし、パッケージpurrrからmap2を使用して各要素を結合することができます。別々の結合されたdata.framesのリストではなく、単一のdata.frameを返すには、map2_dfを使用できます。ベースRで

library(purrr) 
library(dplyr) 

map2_df(list1, list2, inner_join, by = "Wvlgth") 

    Wvlgth Global group  time  IRD 
1 337.0 .9923+00  0 13.445 0.01324 
2 337.5 .01245+00  0 13.445 0.34565 
3 338.0 .0005+00  0 13.445 0.92395 
4 339.0 .74361+00  0 13.445 0.67489 
5 337.0 .1284+00  1 13.45361 0.20981 
6 337.5 .0098+00  1 13.45361 0.98703 
7 338.0 .7853+00  1 13.45361 0.54092 
8 339.0 .1211+00  1 13.45361 0.38567 
+0

これは素晴らしいですね!ありがとうございました! – ale19

0

、あなたはdo.call/rbindMapの出力を供給することができます。

do.call(rbind, Map(merge, list1, list2, by="Wvlgth")) 
    Wvlgth Global group  time  IRD 
1 337.0 .9923+00  0 13.445 0.01324 
2 337.5 .01245+00  0 13.445 0.34565 
3 338.0 .0005+00  0 13.445 0.92395 
4 339.0 .74361+00  0 13.445 0.67489 
5 337.0 .1284+00  1 13.45361 0.20981 
6 337.5 .0098+00  1 13.45361 0.98703 
7 338.0 .7853+00  1 13.45361 0.54092 
8 339.0 .1211+00  1 13.45361 0.38567 

Map二つのリストに対応するdata.framesをマージしdata.framesの単一のリストを返します。これらのdata.framesには、do.callrbindが付加されます。

データセットが特に大きい場合は、data.tableからrbindlistと、追記を行うことができます。data.tableオブジェクトを返します

library(data.table) 
rbindlist(Map(merge, list1, list2, by="Wvlgth")) 

を。

関連する問題