[英]How to merge multiple data.frames and sum and average columns at the same time in R
[英]Merge data frames and sum columns with the same name
我在每个数据框中都有相对大量的年份,每个数据框中都有不同的国家名称。 在我的可重现示例中, df2
包含国家d
,而df1
中不存在该国家。 我可以使用几行代码来实现我的目标,如df3
所示。 df3
应该是df1
和df2
的总和,条件是国家名称和年份。 我确信有一种更简单的方法,但我自己找不到解决方案。 非常欢迎您的帮助,我提前感谢您。
df1 <- data.frame(country = c("a", "b", "c"), year1 = c(1, 2, 3), year2 = c(1, 2, 3))
df2 <- data.frame(country = c("a", "b", "d"), year1 = c(1, 2, 3), year2 = c(1, 2, 3))
df3 <- merge(df1, df2, by = "country", all = TRUE) %>%
replace_na(list(
year1.x = 0, year1.y = 0,
year2.x = 0, year2.y = 0)) %>%
mutate(
year1 = year1.x + year1.y,
year2 = year2.x + year2.y) %>%
select(-c(
year1.x, year1.y,
year2.x, year2.y))
这给出了我的预期结果,但我需要大量的手动输入才能在很长一段时间内实现它。
使用此代码生成的df3
:
country year1 year2
1 a 2 2
2 b 4 4
3 c 3 3
4 d 3 3
data.table
rbindlist(list(df1, df2))[, lapply(.SD, sum, na.rm =T), by = country]
country year1 year2
1: a 2 2
2: b 4 4
3: c 3 3
4: d 3 3
一种方法是:
library(dplyr)
bind_rows(df1, df2) %>%
#mutate_if(is.numeric, tidyr::replace_na, 0) %>% #in case of having NAs
group_by(country) %>%
summarise_all(., sum, na.rm = TRUE)
# # A tibble: 4 x 3
# country year1 year2
# <chr> <dbl> <dbl>
# 1 a 2 2
# 2 b 4 4
# 3 c 3 3
# 4 d 3 3
或基础 r 解决方案
aggregate(. ~ country, rbind(df1, df2), sum, na.rm = TRUE, na.action = NULL)
这将生成相同的 output。
一个非常简单的base
解决方案:
df3 <- merge.data.frame(df1, df2, by = "country",all = TRUE,suffixes=c("","")
df3[is.na(df3)] <- 0
df3 <- cbind(country=df3$country,df3[,2:3]+df3[,4:5])
country year1 year2
1 a 2 2
2 b 4 4
3 c 3 3
4 d 3 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.