通过不同的列名称合并data.frames并返回用于匹配的BOTH列

时间:2019-05-23 21:46:22

标签: r join merge dplyr

超级简单的愚蠢。 我正在构建一个闪亮的应用程序,并比较两个表中的列名。我从information.schema中进行选择,人们将希望同时看到联接中使用的列

 X<-data.frame(table1=c("col1","col2"),types1=c("int","char(4)"))
 Y<-data.frame(table2=c("col2","col3"),types2=c("char(8)","tinyint"))

无论我merge和使用all=TRUE还是运行dplyrleft_join之类的full_join命令,这些东西中的每一个都给了我输出如下:

    table1   types1   types2
    col1     int      NA
    col2     char(4)  char(8)
    col3     NA       tinyint

我想让列退回。我想要这个:

    table1   table2   types1   types2
    col1     NA       int      NA
    col2     col2     char(4)  char(8)
    NA       col3     NA       tinyint

我不希望在一列中折叠显​​示列名称。我希望这些列保持易于阅读的形式,以便他们知道哪里缺少什么。

2 个答案:

答案 0 :(得分:1)

一种选择是通过从'X'和'Y'数据集中的'table1 / table2'中提取数字来创建公共列('grp'),然后加入该变量

library(dplyr)
library(readr)
X %>% 
   mutate(grp = parse_number(as.character(table1))) %>% 
   full_join(Y %>%
             mutate(grp = parse_number(as.character(table2)))) %>%
   select(starts_with('table'), starts_with('types'))
#  table1 table2  types1  types2
#1   col1   <NA>     int    <NA>
#2   col2   col2 char(4) char(8)
#3   <NA>   col3    <NA> tinyint

答案 1 :(得分:1)

这不是很优雅,但是我有一个解决方法...即使在函数中添加参数会很好。

    Y$join<-Y[,"table2"]
    JoinedTable<-merge(X,Y,by.x="table1",by.y="join",all=TRUE)
    JoinedTable[,1]<-ifelse(is.na(JoinedTable[,2]),NA,JoinedTable[,1])