【问题标题】:R: Updating one table based on anotherR:基于另一个表更新一个表
【发布时间】:2021-01-19 16:36:06
【问题描述】:

我有两个数据框,我们称它们为 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 表包含一些不正确的 geographyID:age_bucket 组合重复(它不应该,但由于本文范围之外的原因,我现在无法调整它)。因此,我正在寻找一种可以更新所有相关行的解决方案。

【问题讨论】:

  • 你用的是左连接还是右连接?

标签: r dataframe grepl


【解决方案1】:

类似这样的:

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)

【讨论】:

  • 谢谢!当我删除“select(-rowname)”(或“select(rownames)” - 我都尝试了)位时,这有效。是否有一个单独的包我需要能够引用 rownames 列?
  • 嗯,您在问题中显示的示例数据看起来像它的第一列名为 rownameselect(-rowname) 删除该列,因为我们不想加入它。如果它不存在,那么您不必担心它。我所要做的就是我在你的问题中看到的内容。
猜你喜欢
  • 1970-01-01
  • 2013-06-12
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
相关资源
最近更新 更多