Как рассчитать процент на основе другой строки - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть датафрейм в 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)),]

Я просто не уверен, куда идти дальше, чтобы уменьшить его и вычислить проценты.

1 Ответ

0 голосов
/ 22 апреля 2019

Это начало решения:

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))

Вам не нужно фильтровать категорию «Всего», но обычно не рекомендуется иметь «общую» категорию (лучше иметьколонка для этого)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...