2015-12-17 10 views
11

私はleft_join複数のデータフレームにしたい:dplyrを使用して複数のデータフレームに参加するにはどうすればよいですか?

dfs <- list(
    df1 = data.frame(a = 1:3, b = c("a", "b", "c")), 
    df2 = data.frame(c = 4:6, b = c("a", "c", "d")), 
    df3 = data.frame(d = 7:9, b = c("b", "c", "e")) 
) 
Reduce(left_join, dfs) 
# a b c d 
# 1 1 a 4 NA 
# 2 2 b NA 7 
# 3 3 c 5 8 

これは、彼らがすべて同じb列を持っているので、動作しますが、私はleft_joinに渡すことができる追加の引数を指定しReduceことはできません。このようなことのための回避策はありますか?

dfs <- list(
    df1 = data.frame(a = 1:3, b = c("a", "b", "c")), 
    df2 = data.frame(c = 4:6, d = c("a", "c", "d")), 
    df3 = data.frame(d = 7:9, b = c("b", "c", "e")) 
) 

更新

作品のこの種:Reduce(function(...) left_join(..., by = c("b" = "d")), dfs)しかしbyが複数の要素であるときには、このエラーを与える:Error: cannot join on columns 'b' x 'd': index out of bounds

+3

あなたは ''(関数(...)left_joinここで(...、他の引数)、DFS)を削減することができません? –

+0

私はそれを考えていませんでした。はい、できます!あなたの答えとして書いてもよろしいですか? – nachocab

+0

実際には、 'by'に複数の要素がある場合、これは中断します。 update – nachocab

答えて

3

私はまだ知りませんでした....今日私は未回答の質問セクションに導入されました。気にして申し訳ありません。 merge()を使用してleft_join()

dfs <- list(
       df1 = data.frame(b = c("a", "b", "c"), a = 1:3), 
       df2 = data.frame(d = c("a", "c", "d"), c = 4:6), 
       df3 = data.frame(b = c("b", "c", "e"), d = 7:9) 
     ) 

func <- function(...){ 
    df1 = list(...)[[1]] 
    df2 = list(...)[[2]] 
    col1 = colnames(df1)[1] 
    col2 = colnames(df2)[1] 
    xxx = left_join(..., by = setNames(col2,col1)) 
    return(xxx) 
} 
Reduce(func, dfs) 
# b a c d 
#1 a 1 4 NA 
#2 b 2 NA 7 
#3 c 3 5 8 

を使用して

func <- function(...){ 
    df1 = list(...)[[1]] 
    df2 = list(...)[[2]] 
    col1 = colnames(df1)[1] 
    col2 = colnames(df2)[1] 
    xxx=merge(..., by.x = col1, by.y = col2, , all.x = T) 
    return(xxx) 
} 

Reduce(func, dfs) 
# b a c d 
#1 a 1 4 NA 
#2 b 2 NA 7 
#3 c 3 5 8 
+0

の答えを確認してください。「キー」変数をマージした後は自動的にデータフレームの最初の列になるため、最初の列としてキーの変数を保持する必要がありました –

4

はあなたのためにこの仕事はしませんか?

jnd.tbl <- df1 %>% 
    left_join(df2, by='b') %>% 
    left_join(df3, by='d') 
+5

よく一般化していません(これは問題のようです)。 – Gregor

+1

これは最善の解決策であるようです。実際には、一般的には一般的です。別のテーブルに結合する場合は、パイプラインにもう1つの行を追加するだけです。このコードは、SQLの複数の結合クエリとあまり変わらないものになります。 –

+0

@HongOoiでもby =変数は変わりますか?この –

関連する問題