Как условно вырезать набор данных по группе, используя именованный список? - PullRequest
1 голос
/ 01 апреля 2020

У меня есть набор данных ответов на опросы из большого числа стран, которые я хотел бы сократить в соответствии с возрастными диапазонами, указанными в данных переписи (другой набор данных). Я извлек диапазоны возраста из данных переписи в список и преобразовал их в векторы контрольных точек для каждой страны.

Я хотел бы использовать этот список контрольных точек для преобразования переменной возраста в age_ranges (так что я могу в конечном итоге сравнить разбивку по возрасту данных обследования с разбивкой по возрасту переписи).

Это код, который у меня есть до сих пор:

age <- sample(18:50, 100, replace = TRUE)
group <- sample(c("group A", "group B", "group C"), 100, replace = TRUE)
df <- data.frame(age, group)

cutpoints <- list(group A = c(18, 27, 36, 45), group B = c(15, 24, 50), group C = c(30, 40, 50, 60, 70))

df %>%
  group_by(group) %>%
  mutate(cut_group = 
           cut(age,cutpoints))

Где точки вырезки - это именованный список. Имена соответствуют «группе» (страна в моем случае), а точки отсечения - это векторы нижних нижних границ, по которым я хотел бы сократить переменную возраста. Опять же, эти контрольные точки варьируются от страны к стране.

Приведенный выше код выдает сообщение об ошибке Error in sort.int(as.double(breaks)) : (list) object cannot be coerced to type 'double'

Я просматривал эту запись, но приведенный выше код по существу следует инструкции, но все равно приводят к ошибке.

1 Ответ

2 голосов
/ 01 апреля 2020

Мы можем преобразовать cutpoints в фрейм данных и объединить его с df. Затем мы можем использовать cut для создания отдельных групп на основе диапазона.

library(dplyr)

df %>%
  left_join(tibble::enframe(cutpoints),by = c('group' = 'name')) %>%
  group_by(group) %>% 
  mutate(grp_int = cut(age, c(-Inf, sort(na.omit(first(value))), Inf))) %>%
  select(-value)

#     age group   grp_int  
#   <int> <chr>   <chr>    
# 1    41 group C (40,50]  
# 2    41 group A (36,45]  
# 3    22 group A (18,27]  
# 4    36 group B (24,50]  
# 5    19 group C (-Inf,30]
# 6    42 group B (24,50]  
# 7    40 group A (36,45]  
# 8    44 group B (24,50]  
# 9    29 group A (27,36]  
#10    33 group B (24,50]  
# … with 90 more rows

Мы можем использовать group, а также grp_int в качестве группы для вычисления любой необходимой нам информации для каждого диапазона age значений в каждом group.

...