Как создать новые наблюдения с суммой новой группы?
У меня есть следующий фрейм данных:
gender age population
H 0-4 5
H 5-9 5
H 10-14 10
H 15-19 15
H 20-24 15
H 25-29 10
M 0-4 0
M 5-9 5
M 10-14 5
M 15-19 15
M 20-24 10
M 25-29 15
И мне нужно перегруппировать возрастные категории в следующем фрейме данных:
gender age population
H 0-14 20
H 15-19 15
H 20-29 25
M 0-14 10
M 15-19 15
M 20-29 25
Я предпочитаю dplyr, поэтому, если есть способ сделать это с помощью этих пакетов, я ценю.
2 ответа
Решение
Использование разделения строки - tidyr::separate()
а также cut()
:
library(dplyr)
library(tidyr)
df1 %>%
separate(age, into = c("age1", "age2"), sep = "-", convert = TRUE ) %>%
mutate(age = cut(age1,
breaks = c(0, 14, 19, 29),
labels = c("0-14", "15-19", "20-29"),
include.lowest = TRUE)) %>%
group_by(gender, age) %>%
summarise(population = sum(population))
# output
# gender age population
# (fctr) (fctr) (int)
# 1 H 0-14 20
# 2 H 15-19 15
# 3 H 20-29 25
# 4 M 0-14 10
# 5 M 15-19 15
# 6 M 20-29 25
data.table
решение где dat
это таблица:
library(data.table)
dat <- as.data.table(dat)
dat[ , mn := as.numeric(sapply(strsplit(age, "-"), "[[", 1))]
dat[ , age := cut(mn, breaks = c(0, 14, 19, 29),
include.lowest = TRUE,
labels = c("0-14", "15-19", "20-29"))]
dat[ , list(population = sum(population)), by = list(gender, age)]
# gender age population
# 1: H 0-14 20
# 2: H 15-19 15
# 3: H 20-29 25
# 4: M 0-14 10
# 5: M 15-19 15
# 6: M 20-29 25