加入共享列名和一些字符串的数据框

时间:2019-08-28 11:14:07

标签: r dplyr

我似乎有一个简单的数据帧连接或合并。两个数据框共享列和一些行。

使用full_join时,列会匹配,但共享行不会被连接。

我有以下伪代码:

a<- c('x1', 'x2',   'x3',   'x4')
b<- c(12,   18, 11, 14)
c<- c(15,   23, 40, 43)
d<- c(0.2,  0.3,    NA, NA)

n1<-data.frame(a,b,c,d)

a<- c('x3', 'x4')
d<- c(1.1,  1.0)

n2<-data.frame(a,d)

n3<-full_join(n1,n2)

我得到了以下内容:

a   b   c   d
x1  12  15  0.2
x2  18  23  0.3
x3  11  40  NA
x4  14  43  NA
x3  NA  NA  1.1
x4  NA  NA  1

但我希望:

a   b   c   d
x1  12  15  0.2
x2  18  23  0.3
x3  11  40  1.1
x4  14  43  1

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

R的基本选项是匹配行和列的名称。

mrow = match(n1$a,n2$a)
mcol = match(colnames(n1),colnames(n2))

# [-1] removes the x1,x2 .. column
n1[!is.na(mrow),which(!is.na(mcol))[-1]] = n2[na.omit(mrow),na.omit(mcol)[-1]]
> n1
   a  b  c   d
1 x1 12 15 0.2
2 x2 18 23 0.3
3 x3 11 40 1.1
4 x4 14 43 1.0

答案 1 :(得分:0)

当前,full_join使用两列"a""d"完成,因为它们是n1n2之间的公共列。您可能只需要通过"a"加入,然后使用coalesce

library(dplyr)

full_join(n1, n2, by = "a") %>%
   mutate(d = coalesce(d.x, d.y)) %>%
   select(-d.x, -d.y)

#   a  b  c   d
#1 x1 12 15 0.2
#2 x2 18 23 0.3
#3 x3 11 40 1.1
#4 x4 14 43 1.0

答案 2 :(得分:0)

我们可以使用data.table join轻松地做到这一点,而无需创建其他列,然后进行修改/删除

library(data.table)
setDT(n1)[n2, d := i.d, on = .(a)]
n1
#    a  b  c   d
#1: x1 12 15 0.2
#2: x2 18 23 0.3
#3: x3 11 40 1.1
#4: x4 14 43 1.0