Как создать новые наблюдения с суммой новой группы?

У меня есть следующий фрейм данных:

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
Другие вопросы по тегам