r - 使用 R 中第二个数据表中的观测值填充一个数据表中的 NA 值

标签 r merge datatable na

我不敢相信我在找到这个问题的解决方案时遇到了这么大的麻烦:我有两个具有相同行和列的数据表,如下所示:

Country <- c("FRA", "FRA", "DEU", "DEU", "CHE", "CHE")
Year <- c(2010, 2020, 2010, 2020, 2010, 2020)
acctm <- c(20, 30, 10, NA, 20, NA)
acctf <- c(20, NA, 15, NA, 40, NA)

dt1 <- data.table(Country, Year, acctm, acctf)

   Country Year acctm acctf
1      FRA 2010    20    20
2      FRA 2020    30    NA
3      DEU 2010    10    15
4      DEU 2020    NA    NA
5      CHE 2010    20    40
6      CHE 2020    NA    NA

Country <- c("FRA", "FRA", "DEU", "DEU", "CHE", "CHE")
Year <- c(2010, 2020, 2010, 2020, 2010, 2020)
acctm <- c(1, 1, 1, 60, 1, 70)
acctf <- c(1, 60, 1, 80, 1, 100)

dt2 <- data.table(Country, Year, acctm, acctf)

   Country Year acctm acctf
1      FRA 2010    1     1
2      FRA 2020    2    60
3      DEU 2010    1     1
4      DEU 2020    60   80
5      CHE 2010    1     2
6      CHE 2020    70  100

我需要创建一个新的数据表,将 dt1 中的 NA 值替换为 dt2 中相应国家/地区/年份/变量匹配的值>,生成一个如下所示的表格:

   Country Year acctm acctf
1      FRA 2010    20    20
2      FRA 2020    30    60
3      DEU 2010    10    15
4      DEU 2020    60    80
5      CHE 2010    20    40
6      CHE 2020    70   100

最佳答案

我们可以通过连接 on 来做到这一点“国家/地区”、“年份”列

library(data.table)
nm1 <- names(dt1)[3:4]
nm2 <- paste0("i.", nm1)
dt3 <- copy(dt1)
dt3[dt2, (nm1) := Map(function(x, y) 
   fifelse(is.na(x), y, x), mget(nm1), mget(nm2)), on = .(Country, Year)]
dt3
#   Country Year acctm acctf
#1:     FRA 2010    20    20
#2:     FRA 2020    30    60
#3:     DEU 2010    10    15
#4:     DEU 2020    60    80
#5:     CHE 2010    20    40
#6:     CHE 2020    70   100

或者要使其紧凑,请使用 fcoalesce来自data.table (评论来自@IceCreamToucan)

dt3[dt2,  (nm1) := Map(fcoalesce, mget(nm1), mget(nm2)), on = .(Country, Year)]

如果数据集具有相同的维度并且“国家/地区”、“年份”的值相同,则另一个选项是

library(purrr)
library(dplyr)
list(dt1[, .(acctm, acctf)], dt2[, .(acctm, acctf)]) %>% 
      reduce(coalesce) %>%
      bind_cols(dt1[, .(Country, Year)], .)

关于r - 使用 R 中第二个数据表中的观测值填充一个数据表中的 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59953981/

相关文章:

jsf - primefaces 数据表用分页器全选

r - 如何按组获取汇总统计数据

r - 根据第二个数据帧中的值过滤数据帧

Git merge : parallel identical additions are merged without conflict by including the same code block TWICE in the merged file without complaint. 为什么?

c# - 如何将 dataGridView 预定义列与 sql 语句中的列绑定(bind)(不添加新列)?

asp.net - Option Strict On 不允许从 'String' 到 'Integer' 的隐式转换

r - 如何在 R 中执行前向选择、后向选择和逐步回归?

r - 将数据框转换为R中的列表

c# - 合并两个 SQLite 数据库文件 (C# .NET)

java - 如何保持这个合并数组方法在边界内?