purrr split%>% map%>% bind VERSUS dplyr group_by%>% do - PullRequest
2 голосов
/ 05 мая 2019

Я часто в состоянии хотеть разделить-применить-объединить регрессионные модели. Я нашел два способа сделать это: «purrr» и «dplyr::do()».

Проблема с подходом purrr: я хочу, чтобы столбцы в результирующем data.frame указывали уровни переменных, в соответствии с которыми было выполнено разделение, как в обычной операции group_by %>% суммирования.

Проблема с подходом dplyr::do(): есть неприятный клубок do(tidy(lm_robust)), который явно не элегантен. Но я вернул колонны.

Main Q: есть ли способ сделать split-apply-Объединить в purrr, который прекрасно возвращает переменные разбиения?

Минимальный рабочий пример, приведенный ниже, показывает, что проблема связана с тем, сколько переменных вы разделяете.

library(tidyverse)
library(estimatr) # for lm_robust

# spliting by one variable

# the purrr approach
mtcars %>%
  split(.$am) %>%
  map(~lm_robust(mpg ~ hp, data = .)) %>%
  map_df(tidy, .id = "am") # annoying to have to type "am" again!

# the dplyr do() approach
mtcars %>%
  group_by(am) %>%
  do(tidy(lm_robust(mpg ~ hp, data = .))) # gross nesting

# Splitting by two variables

# the purr approach??
mtcars %>%
  split(list(.$am, .$vs)) %>%
  map(~lm_robust(mpg ~ hp, data = .))  %>%
  map_df(tidy, .id = "OH NO") # the column encodes both am and vs info

# the dplyr do() approach works great
mtcars %>%
  group_by(am, vs) %>%
  do(tidy(lm_robust(mpg ~ hp, data = .))) # still nested up.

EDIT

вот способ, который использует nest () и unnest (). неуклюжий, но, может быть, лучший подход мурлыкать? вдохновленный http://stat545.com/block024_group-nest-split-map.html

mtcars %>%
  group_by(am, vs) %>%
  nest() %>%
  mutate(fit = map(data, ~lm_robust(mpg ~ hp, data = .)),
         tidy = map(fit, tidy)) %>%
  select(am, vs, tidy) %>%
  unnest(tidy)

РЕДАКТИРОВАТЬ 2

Вот способ с group_map, такой же уродливый, как и do, но, может быть, так оно и есть.

mtcars %>%
  group_by(am, vs) %>%
  group_map(~tidy(lm_robust(mpg ~ hp, data = .x)))

РЕДАКТИРОВАТЬ 3:

Полагаю, то, что мне показалось бы красивым, делало бы одну вещь в строке, что-то вроде этого, но я уважаю комментарии ниже, говорящие, черт, карта группы довольно близка.

# does not work
mtcars %>%
  group_by(am, vs) %>%
  map(~lm_robust(mpg ~ hp, data = .)) %>%
  map_df(tidy)
...