R:根据另一个更新 table
R: Updating one table based on another
我有两个数据帧,我们称它们为 A 和 B。数据框 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)
我有两个数据帧,我们称它们为 A 和 B。数据框 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)