r - 合并两个数据表,如果dt1有NA则从dt2取值
问题描述
我有两个数据表。我将它们合并到 4 个常用列中(主键 = col1)。但是,dt1 中的许多行在 3 个子键(col2、col3、col4)中都有 NA。合并时,它们保留 NA 而不是从 dt2 中与它们匹配的行中获取现有值。
例子:
setkey(dt1, letter, number)
setkey(dt2, letter, number)
dt1 dt2
letter number size letter number color
a 10 big a 10 blue
b NA small b 20 orange
c 30 big c 30 yellow
d 40 big d 40 red
dt_merged <- merge(dt1, dt2, all=TRUE)
dt_merged
letter number size color
a 10 big blue
b NA small orange
c 30 big yellow
d 40 big red
每当 dt1 具有 NA 时,如何调整合并以从 dt2 获取这 3 列(例如 col2、col3、col4)的值?
编辑:添加大小列,因为以前似乎没有必要将 DT 与给定值合并。
解决方案
对于此示例数据集,可以使用coalesce
包中的NAdplyr
来解决问题。dt1
如果您有更多列(您提到了 col2、col3、col4),您可能应该coalesce
在两个数据集之间使用相同的理由将它们全部放在一起。
library(dplyr)
dt1 %>%
mutate(number = coalesce(number, dt2$number)) %>%
inner_join(dt2, by = c("letter", "number"))
# letter number size color
# 1 a 10 big blue
# 2 b 20 small orange
# 3 c 30 big yellow
# 4 d 40 big red
数据
dt1 <- structure(list(letter = c("a", "b", "c", "d"), number = c(10L,
NA, 30L, 40L), size = c("big", "small", "big", "big")), class = "data.frame", row.names = c(NA, -4L))
dt2 <- structure(list(letter = c("a", "b", "c", "d"), number = c(10L,
20L, 30L, 40L), color = c("blue", "orange", "yellow", "red")), class = "data.frame", row.names = c(NA, -4L))
推荐阅读
- vba - 使用 VBScript 发送电子邮件,但将已发送项目保留为未读?
- c# - 在部署目标上创建文件夹/目录
- ruby-on-rails - Searchkick 聚合或
- git - Apache 在另一个分支上无法正常工作
- c# - 本地化 ASP.NET Core 2.2 不适用于视图模型和视图
- php - 我想加快 curl 自动追随者 facebook
- sql-server - T-SQL 如果数据库不存在则创建数据库,如果存在则使用它
- .net - 串口波特率高的问题
- c# - 为什么我在最后一列“Total_Monthly_Amount”中得到“0”值?
- apache-spark - Spark2 无法将数据帧写入镶木地板蜂巢表:HiveFileFormat`。它与指定的格式“ParquetFileFormat”不匹配