我有两个具有统一索引v1的数据帧。如果有数字,我需要创建没有NA值的第三个数据框。
我尝试了dplyr中的join函数和plyr中的rbind.fill函数的各种组合。
# Given
v1 <- c("a", "b", "c", "d")
df1 <- cbind.data.frame(v1, v2 = c(1,NA,3,NA))
df2 <- cbind.data.frame(v1, v2 = c(NA,2,NA,4))
# I would like
df3 <- cbind.data.frame(v1, v2 = c(1,2,3,4))
我如何做到这一点?
答案 0 :(得分:3)
一种选择是先对“ v1”进行full_join
,然后对“ v2”列进行coalesce
library(dplyr)
full_join(df1, df2, by = 'v1') %>%
transmute(v1, v2 = coalesce(v2.x, v2.y))
答案 1 :(得分:2)
这是一个简单的基本解决方案:
> df3 = df2
> df3$v2 = ifelse(is.na(df1$v2),df2$v2,df1$v2)
> df3
v1 v2
1 a 1
2 b 2
3 c 3
4 d 4
ifelse
根据一列的NA性质从一列或另一列中选择数字。
如果源v2
的两个列或两个列都不为NA,但样本中没有任何列,而您没有提及它,则无法解决问题。
答案 2 :(得分:1)
我确定我是从@akrun那里获得的,但是找不到该线程。发布答案以供将来参考:
library(data.table)
setDT(df1)[df2, v2i := i.v2, on='v1'][is.na(v2), v2 := v2i][,v2i:= NULL][]
#> v1 v2
#> 1: a 1
#> 2: b 2
#> 3: c 3
#> 4: d 4
由reprex package(v0.2.1)于2019-05-13创建
@Henrik's comment还建议以下内容:
setDT(df1)[is.na(v2), v2 := setDT(df2)[.SD, v2, on = .(v1)]]
但是我个人更喜欢第一个解决方案,主要是因为获得答案的顺序(先加入数据帧,然后再替换NA
)。
答案 3 :(得分:0)
您可以使用我的软件包 safejoin
# devtools::install_github("moodymudskipper/safejoin)
library(safejoin)
safe_left_join(df1, df2, by = "v1", conflict = dplyr::coalesce)
# v1 v2
# 1 a 1
# 2 b 2
# 3 c 3
# 4 d 4