我似乎有一个简单的数据帧连接或合并。两个数据框共享列和一些行。
使用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
任何帮助将不胜感激。
答案 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"
完成,因为它们是n1
和n2
之间的公共列。您可能只需要通过"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