r - 根据与另一个表的关系填充缺失值

标签 r data.table

我有两个数据表,city_pop , 和 city_sub . city_pop是平均人口缺失一些值的城市列表。 city_sub表格给出了两种可能的 city_id ( sub_1sub_2 )其 avg_pop可以用来填NAcity_pop . sub_1sub_2将按优先顺序使用。只有NA avg_pop 中的值需要更换。

如何在不使用 for 循环的情况下执行此操作?

city_id = c(1, 2, 3, 4, 5, 6)
avg_pop = c(100, NA, NA, 300, 400, NA)

city_pop = data.table(city_id, avg_pop)

   city_id avg_pop
1:       1     100
2:       2      NA
3:       3      NA
4:       4     300
5:       5     400
6:       6      NA

sub_1=c(2,1,4,3,1,3)
sub_2=c(5,5,6,6,2,4)

city_sub =data.table(city_id,sub_1,sub_2)

   city_id sub_1 sub_2
1:       1     2     5
2:       2     1     5
3:       3     4     6
4:       4     3     6
5:       5     1     2
6:       6     3     4

预期输出 -
  city_id avg_pop
1       1     100
2       2     100
3       3     300
4       4     300
5       5     400
6       6     300

最佳答案

这是 dplyr 的方法使用 coalesce它使用第一个非 NA值(value)。我创建了一个单独的列 avg_pop2因为在这种情况下看起来更安全,并且也可以轻松验证结果。

city_pop %>% 
  left_join(city_sub, by = "city_id") %>% 
  mutate(
    avg_pop2 = coalesce(
      avg_pop, avg_pop[match(sub_1, city_id)], avg_pop[match(sub_2, city_id)]
    )
  )

  city_id avg_pop sub_1 sub_2 avg_pop2
1       1     100     2     5      100
2       2      NA     1     5      100
3       3      NA     4     6      300
4       4     300     3     6      300
5       5     400     1     2      400
6       6      NA     3     4      300

关于r - 根据与另一个表的关系填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446511/

相关文章:

r - 使用二分搜索按范围对 data.table 进行子集化

r - 如何按条件在r中其他列中对行进行排序?

r - 如何使用 rscript 代码在 shiny 的 ui.R 中填充下拉菜单?

r - 将数据从长数据更改为矩阵

r - data.table 在只有一行时添加列表作为列

r - 按 data.table 中的列表列子集快速分组

r - 如何将摘要统计值添加到数据框的每一行?

r - 如何使用 curly curly 将值转换为数字并过滤掉函数内的 NA?

r - 涉及 NaN、NA、numeric(0) 的 pivot_longer tibble

r - Data.table 与 cor.test 按组