【问题标题】:R: Sum variable values conditional on value of other variableR:以其他变量的值为条件求和变量值
【发布时间】:2016-04-20 00:50:30
【问题描述】:

我有一个如下所示的数据框:

  year country inhabitants
1    1       A          15
2    2       A          10
3    3       A          24
4    1       B          76
5    2       B          69
6    3       B          58
7    1       C         120
8    2       C         131
9    3       C         128

现在,我想为所有国家/地区创建每年“居民”的总和。 即,我的解决方案如下所示:

  year country inhabitants sum_inhabitants
1    1       A          15             211
2    2       A          10             210
3    3       A          21             207
4    1       B          76             211
5    2       B          69             210
6    3       B          58             207
7    1       C         120             211
8    2       C         131             210
9    3       C         128             207

我的原始数据框包含更多观察结果,这就是为什么我不能手动进行计算。

【问题讨论】:

  • 如果您能提供一个最小的可重现示例来解决您的问题,那就太好了。我们可以从中工作并使用它来向您展示如何回答您的问题。这样,将来其他人也可以适合您的问题以及随附的答案。您可以查看this SO post,了解如何在 R 中制作出色的可重现示例。另外,请概述您已经尝试过的内容。
  • @EricFail 寻找没有累积金额的其他骗子

标签: r time-series data-manipulation recode


【解决方案1】:

我们可以使用ave 来逐年求和,无需外部包。它比aggregate 的优点是它不会汇总而是在线填充:

df$sum_inhabitants <- ave(df$inhabitants, df$year, FUN=sum)
# year country inhabitants sum_inhabitants
# 1    1       A          15             211
# 2    2       A          10             210
# 3    3       A          21             207
# 4    1       B          76             211
# 5    2       B          69             210
# 6    3       B          58             207
# 7    1       C         120             211
# 8    2       C         131             210
# 9    3       C         128             207

【讨论】:

  • 完美,非常感谢!有没有办法忽略“居民”中的 NA?
  • 是的。 ave(df$inhabitants, df$year, FUN=function(x) sum(x, na.rm=T))
【解决方案2】:

使用dplyr 包,你可以这样做:

library(dplyr)
df %>% group_by(year) %>% summarise(sum_inhabitants = sum(inhabitants))

如果您确实想在该列中保留重复项并将其添加到原始数据框中,请将上面的 summarise 更改为 mutate,这将为您提供上面指定的确切输出。

如果您想按年份和国家/地区获取,可以这样做:

df %>% group_by(year, country) %>% summarise(sum_inhabitants = sum(inhabitants))

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多