我正在尝试在R中合并2个数据帧,但是我有两个具有不同ID变量类型的不同列。有时一行中的某个列将具有值,而另一列则没有。我想同时考虑它们,因此,如果一帧缺少其中一列的值,则将使用另一帧。
> df1 <- data.frame(first = c('a', 'b', NA), second = c(NA, 'q', 'r'))
> df1
first second
1 a <NA>
2 b q
3 <NA> r
> df2 <- data.frame(first = c('a', NA, 'c'), second = c('p', 'q', NA))
> df2
first second
1 a p
2 <NA> q
3 c <NA>
我想合并这两个数据框并获得2行:
在这种情况下,NA必须被忽略并且不要“匹配”,这一点很重要。
我可以接近一点:
> merge(df1,df2, by='first', incomparables = c(NA))
first second.x second.y
1 a <NA> p
> merge(df1,df2, by='second', incomparables = c(NA))
second first.x first.y
1 q b <NA>
但是我不能将这两个数据框一起捆扎在一起,因为它们具有不同的列名,和这似乎不是“ R”方式(在不久的将来,我'将具有第三,第四甚至第五种类型的ID。
有没有那么笨拙的方法?
编辑:理想情况下,输出应如下所示:
> df3 <- data.frame(first = c('a', 'b'), second = c('p','q'))
> df3
first second
1 a p
2 b q
答案 0 :(得分:1)
我们可以使用sqldf
进行操作,就像在SQL中一样,我们可以使用OR
在连接条件之间进行切换
library(sqldf)
df <- sqldf("select a.*, b.*
from df1 a
join df2 b
ON a.first = b.first
OR a.second = b.second")
library(dplyr)
#If value in first is NA i.e. is.na(first) is TRUE then use first..3 value's else use first value's and the same for second
df %>% mutate(first = ifelse(is.na(first), first..3, first),
second = ifelse(is.na(second), second..4, second)) %>%
#Discard first..3 and second..4 since we no longer need them
select(-first..3, -second..4)
first second
1 a p
2 b q