2017-10-06 89 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