我有两个统一索引为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))
我怎样才能使这成为可能?
4条答案
按热度按时间4nkexdtk1#
一个选项是对'v1'执行
full_join
,然后对'v2'列执行coalesce
brccelvz2#
下面是一个简单的基本解决方案:
ifelse
根据一列的NA性质从一列或另一列中选取数字。它不包括两个或两个源
v2
列都是NA的情况,但在您的示例中没有,并且您没有提到它……tvz2xvvm3#
我确信我是从@akrun那里得到这个的,但找不到这个帖子。发布一个答案以供将来参考:
创建于2019-05-13由reprex package(v0.2.1)
@Henrik的评论还提出了以下建议:
setDT(df1)[is.na(v2), v2 := setDT(df2)[.SD, v2, on = .(v1)]]
但我个人更喜欢第一种解决方案,主要是因为获得答案的顺序(首先加入 Dataframe ,然后替换
NA
)。11dmarpk4#
我们可以使用{powerjoin}: