加入补充数据框,没有可用值的NA

时间:2019-05-13 19:05:56

标签: r jointable

我有两个具有统一索引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))

我如何做到这一点?

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