R: Как вырезать числовую переменную в сгруппированном файле tbl_df, используя динамические разрывы длины переменной - PullRequest
0 голосов
/ 01 июня 2018

Интересно, как создать категориальную переменную, используя динамические разрывы для сгруппированных числовых переменных, используя dplyr.

Вот пример игрушки, скажем, с использованием данных mtcars, и я хочу классифицировать автомобили на низкие и высокие mpg классов при группировании по vs и am.Автомобиль будет классифицирован как автомобиль с низким уровнем миль на галлон, если его mpg ниже среднего значения mpg его группы.Вот мой способ сделать это

library(tidyverse)
mtcars %>% 
  tbl_df() %>% 
  group_by(vs, am) %>% 
  mutate(lowMPG = ifelse(mpg < mean(mpg), "Yes", "No")) 

Однако моя настоящая проблема более общая, когда разрывы могут быть вектором вместо скаляра для каждой группы.Также функция, используемая для вычисления разрывов, может быть получена из внешнего источника.Таким образом, вы можете сохранить следующий объект в brk в R, чтобы вырезать переменную mpg.

vs    am  breakPoint_1  breakPoint_2   breakPoint_3
0     0   14.0          15.0           17.0
0     1   17.0          19.0
1     0   19.0          21.0
1     1   28.4

Любая помощь будет высоко оценена

1 Ответ

0 голосов
/ 01 июня 2018

Вы можете использовать dplyr и pmap из purrr.Главное - сначала создать точку останова для всех уникальных комбинаций am и vs.

brk_point <- tibble(am = c(0,0,1,1),
                vs = c(0,1,0,1),
                brk = list(c(-Inf, 14,15,17, Inf),
                           c(-Inf, 17,19, Inf),
                           c(-Inf, 19,21, Inf),
                           c(-Inf, 27.4, Inf)))

foo <- mtcars %>%
  tbl_df() %>%
  left_join(., brk_point) 

foo_cut <- foo %>%
  dplyr::mutate(cut_mpg = purrr::pmap(list(.$mpg,.$brk),
                                      cut, 
                                      include.lowest = TRUE))

Вы также можете использовать unnest для его организации.

...