R:根据另一个更新 table

R: Updating one table based on another

我有两个数据帧,我们称它们为 AB。数据框 A 包含 5000 行有关英国不同地区人口的信息。类似的东西:

rowname      geographyID       age_bucket        income       population   
     1        E0100056            0-18            6000           567
     2        E0100056            19-64           28000          2437
     3        E0100056            65+             26000          789
     4        E0100082            0-18            6400           481
     .           .                  .               .             .

所以位置 E0100056 有 789 名 65 岁以上的人,他们的平均年收入为 £26000。 geographyID age_bucket 存储为字符,而收入和人口为数字。

这些地点的一部分现在有了新的人口估计,这些信息存储在数据框中 B:

rowname      geographyID       age_bucket          population   
     1        E0100056            0-18               489
     2        E0100056            19-64              2743
     3        E0100056            65+                882
     .           .                  .               .             

B中只存储了geographyID-age_bucket数据变化的组合,所以只有80行。

我需要做的是用 B 中的新数字更新 A 中的人口数字。为此,我尝试在两个数据框中创建一个“geographyID:age_bucket”索引,并使用它在 B 中找到正确的信息,同时改变 A:

 A$index <- with(A, paste(geographyID, age_bucket, sep=":"))
 B$index <- with(B, paste(geographyID, age_bucket, sep=":"))

 indicies_to_update <- B %>% pull("index")

  A <- A %>%
    mutate(
      population = ifelse(index %in% indicies_to_update, B[which(grepl(index, B$index)),which(colnames(B) == "population")] , population)
    )

不幸的是,这不起作用,因为 grepl() 函数会抛出错误(我认为这与 mutate 将索引作为向量传递有关)。我是 R 的初学者,对如何解决这个问题一无所知。 非常欢迎帮助 - 先谢谢你了!


PS:更复杂的是 A table 包含一些不正确的 geographyID:age_bucket 组合重复(它不应该,但由于超出 post 范围的原因,我现在无法调整)。因此,我正在寻找一种可以更新所有相关行的解决方案。

像这样:

library(dplyr)
A %>%
  left_join(
    B %>% rename(pop_b = population) %>% select(-rowname),
    by = c("geograhyID", "age_bucket")
  ) %>%
  mutate(population = coalesce(pop_b, population)) %>%
  select(-pop_b)