连接互补 Dataframe ,没有可用值的NA

r7xajy2e  于 2023-04-03  发布在  其他
关注(0)|答案(4)|浏览(104)

我有两个统一索引为v1的 Dataframe 。如果有数字,我需要创建第三个没有NA值的 Dataframe 。
我尝试了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))

我怎样才能使这成为可能?

4nkexdtk

4nkexdtk1#

一个选项是对'v1'执行full_join,然后对'v2'列执行coalesce

library(dplyr)
full_join(df1, df2, by = 'v1') %>%
    transmute(v1, v2 = coalesce(v2.x, v2.y))
brccelvz

brccelvz2#

下面是一个简单的基本解决方案:

> 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的情况,但在您的示例中没有,并且您没有提到它……

tvz2xvvm

tvz2xvvm3#

我确信我是从@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

创建于2019-05-13由reprex package(v0.2.1)
@Henrik的评论还提出了以下建议:
setDT(df1)[is.na(v2), v2 := setDT(df2)[.SD, v2, on = .(v1)]]
但我个人更喜欢第一种解决方案,主要是因为获得答案的顺序(首先加入 Dataframe ,然后替换NA)。

11dmarpk

11dmarpk4#

我们可以使用{powerjoin}:

library(powerjoin)
power_left_join(df1, df2, by = "v1", conflict = coalesce_xy)
#   v1 v2
# 1  a  1
# 2  b  2
# 3  c  3
# 4  d  4

相关问题