繁体   English   中英

合并具有相同名称的数据框和总和列

[英]Merge data frames and sum columns with the same name

我在每个数据框中都有相对大量的年份,每个数据框中都有不同的国家名称。 在我的可重现示例中, df2包含国家d ,而df1中不存在该国家。 我可以使用几行代码来实现我的目标,如df3所示。 df3应该是df1df2的总和,条件是国家名称和年份。 我确信有一种更简单的方法,但我自己找不到解决方案。 非常欢迎您的帮助,我提前感谢您。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM