【问题标题】:How to Calculate Percentage Based On Other Row如何根据其他行计算百分比
【发布时间】:2019-04-21 22:02:45
【问题描述】:

我在 R 中有一个包含四列的数据框。我想按州和年份计算 44 岁以下公民的总百分比。

如何在 R 中完成此操作,同时保留年份和状态列?

我已经能够使用聚合来获取总和并从更大的数据集中保留年份/州/年龄值。我只是无法得到整列的总和,但现在我不确定从这里去哪里计算百分比。

|------------||------------||------------||------------|
|    Year    ||    State   ||    Age     ||    Pop     |
|------------||------------||------------||------------|
|    2000    ||     VA     ||    <44     ||    150     |
|------------||------------||------------||------------|
|    2000    ||     VA     ||    44+     ||    350     |
|------------||------------||------------||------------|
|    2000    ||     VA     ||    Total   ||    500     |

理想输出:

|------------||------------||------------||------------|
|    Year    ||    State   ||    Age     ||    Pop     |
|------------||------------||------------||------------|
|    2000    ||     VA     ||    <44     ||    0.3     |
|------------||------------||------------||------------|
|    2004    ||     VA     ||    <44     ||    0.2     |
|------------||------------||------------||------------|
|    2008    ||     VA     ||    <44     ||    0.4     |

这是我用来获取数据框以查看其工作方式的最后一段代码。

demos_sub <- aggregate(demos_sub$total_citizen_pop, by=list(Year=demos_sub$year, State=demos_sub$state, Age=demos_sub$age), FUN=sum)
names(demos_sub) <- c("year","state", "age", "total_citizen_pop")
demos_sub <- demos_sub[with(demos_sub, order(year)),]
demos_sub <- demos_sub[with(demos_sub, order(state)),]

我只是不知道从哪里开始进一步缩小并计算百分比。

【问题讨论】:

  • 你能告诉我们你到目前为止所做的尝试以及你遇到了什么问题吗?
  • 已添加;我只是真的不知道如何前进。
  • 抱歉应该更准确,但我的意思是你能添加你的代码吗?如果我们能看到您遇到的问题,解释起来会容易得多...(您可以使用更简单的数据集来说明您的观点。)
  • 我添加了我上次为达到这一点所做的代码,但我什至不知道从这里继续前进的地方。我不认为聚合会再次起作用......

标签: r


【解决方案1】:

这是解决方案的开始:

library(dplyr)

Year <- rep(2000, 6)
State <- c(rep("VA", 4), rep("MA", 2))
Age <- c("<44", "44+", "44+", "<44", "<44", "44+")
Pop <- c(150, 350, 500, 200, 100, 100)

df <- data.frame(State = State, Age = Age, Pop = Pop, Year= Year)

df %>% filter(Age != "Total") %>% group_by(Year, State)  %>% summarize(Pop44 = sum(Pop[Age=="<44"]) / sum(Pop))

您不必过滤“总计”类别,但拥有“总计”类别通常不是一个好主意(最好有一个列)

【讨论】:

  • 这是一个很好的起点,非常感谢!这不是我的数据,但我绝对不会将总类别放在同一列中。
猜你喜欢
  • 2023-01-02
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多