超级简单的愚蠢。 我正在构建一个闪亮的应用程序,并比较两个表中的列名。我从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
还是运行dplyr
或left_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
我不希望在一列中折叠显示列名称。我希望这些列保持易于阅读的形式,以便他们知道哪里缺少什么。
答案 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])