2017-10-06 127 views
2

我有3個dataframes不等的行合併3個dataframes LEFT JOIN

df1- 
T1  T2  T3 
1  Joe TTT 
2  PP  YYY 
3  JJ  QQQ 
5  UU  OOO 
6  OO  GGG 

df2 
X1  X2 
1  09/20/2017 
2  08/02/2015 
3  05/02/2000 
8  06/03/1999 

df3 
L1  L2 
1  New 
6  Notsure 
9  Also 

最終的數據框應該像左連接DF1的所有3個保留行。匹配的行是T1,X1和L1,但具有不同的標題名稱。每個數據幀的行數不同。我無法找到這種情況的解決方案。就這麼,我發現,可供2個dataframes或3個dataframes具有相同的行或相同的列名

T1  T2  T3   X2   L2 
    1  Joe TTT  09/20/2017 New 
    2  PP  YYY  08/02/2015 NA 
    3  JJ  QQQ  05/02/2000 NA 
    5  UU  OOO  NA   NA 
    6  OO  GGG  NA   NotSure 

我R中比較新的,並不能找到這個

回答

2
使用 tidyverse功能

,你可以嘗試:

df1 %>% 
    left_join(df2, by = c("T1" = "X1")) %>% 
    left_join(df3, by = c("T1" = "L1")) 

這給:

T1 T2 T3   X2  L2 
1 1 Joe TTT 09/20/2017  New 
2 2 PP YYY 08/02/2015 <NA> 
3 3 JJ QQQ 05/02/2000 <NA> 
4 5 UU OOO  <NA> <NA> 
5 6 OO GGG  <NA> Notsure 
3

的A R代碼想法是把你的數據幀在列表中,改變第一列的名稱,並使用Reduce合併,即

Reduce(function(...) merge(..., by = 'Var1', all.x = TRUE), 
    lapply(mget(ls(pattern = 'df[0-9]+')), function(i) {names(i)[1] <- 'Var1'; i})) 

賦予,

Var1 T2 T3   X2  L2 
1 1 Joe TTT 09/20/2017  New 
2 2 PP YYY 08/02/2015  Old 
3 3 JJ QQQ 05/02/2000 <NA> 
4 5 UU OOO  <NA> <NA> 
5 6 OO GGG  <NA> Notsure 
+0

3個點是什麼?我是否需要將它寫入與您所寫的語法相同的語法?除了將其更改爲列名和重命名列名以外,還有其他方法,因爲我從多個Excel中獲取數據,除此合併外,還需要對該數據執行某些其他功能。 – Joe

+1

@sotos達恩。這與我要發佈的內容非常接近。兩個主要區別:* 1 *。 by =在'merge'中是不必要的(至少對於給定的例子)。 * 2 *。你可以在'lapply'中使用'setNames'。兩者都不一定是改進。 – lmo

+1

@lmo偉大的想法......)......好的建議。我希望儘可能讓新用戶可讀,因此冗餘參數 – Sotos

0

隨着left_join()它會是這樣的

df1 = data.frame(X = c("a", "b", "c"), var1 = c(1,2, 3)) 

    df2 = data.frame(V = c("a", "b", "c"), var2 =c(5,NA, NA)) 

    df3 = data.frame(Y = c("a", "b", "c"), var3 =c("name", NA, "age")) 

# rename 
df2 = df2 %>% rename(X = V) 
df3 = df3 %>% rename(X = Y) 

df = left_join(df1, df2, by = "X") %>% 
    left_join(., df3, by = "X") 

> df 
    X var1 var2 var3 
1 a 1 5 name 
2 b 2 NA <NA> 
3 c 3 NA age 
+0

嗨Edu,我沒有相同數量的行,並且列的標題名稱在每個數據幀 – Joe

1

1)平方LDF

​​

1A)雖然稍長這種變化可以更容易通過擺明爲每列來自哪個源審查代碼時以後。如果數據幀名稱很長,則可能需要使用別名。 from df1 as a,但這裏我們不打擾,因爲它們很短。

sqldf("select df1.*, df2.X2, df3.L2 
     from df1 
     left join df2 on df1.T1 = df2.X1 
     left join df3 on df1.T1 = df3.L1") 

2)合併使用重複的合併。沒有使用包。

library(magrittr) 
df1 %>% Merge(df2) %>% Merge(df3) 

圖2b)使用Reduce我們可以做重複的合併是這樣的::

Reduce(Merge, list(df1, df2, df3)) 

Merge <- function(x, y) merge(x, y, by = 1, all.x = TRUE) 
Merge(Merge(df1, df2), df3) 

2A)這也可以使用magrittr管道這樣寫

注意:可重複輸入m是:

Lines1 <- " 
T1  T2  T3 
1  Joe TTT 
2  PP  YYY 
3  JJ  QQQ 
5  UU  OOO 
6  OO  GGG" 

Lines2 <- " 
X1  X2 
1  09/20/2017 
2  08/02/2015 
3  05/02/2000 
8  06/03/1999" 

Lines3 <- " 
L1  L2 
1  New 
6  Notsure 
9  Also" 

df1 <- read.table(text = Lines1, header = TRUE) 
df2 <- read.table(text = Lines2, header = TRUE) 
df3 <- read.table(text = Lines3, header = TRUE) 
+0

不同,如果您還可以提供比較選項:D – Aramis7d