R dplyr: записать вывод списка в фрейм данных - PullRequest
4 голосов
/ 11 апреля 2019

Предположим, у меня есть следующая функция

SlowFunction = function(vector){
  return(list(
    mean =mean(vector),
    sd  = sd(vector)
    ))
  }

И я хотел бы использовать dplyr: резюмировать, чтобы записать результаты в фрейм данных:

iris %>% 
  dplyr::group_by(Species) %>% 
  dplyr::summarise(
    mean = SlowFunction(Sepal.Length)$mean,
    sd   = SlowFunction(Sepal.Length)$sd
    )

У кого-нибудь есть предложения, какЯ могу сделать это, вызывая «SlowFunction» один раз вместо двух?(В моем коде «SlowFunction» - медленная функция, которую мне приходится вызывать много раз.) Конечно, без разбиения «SlowFunction» на две части.Так что на самом деле я хотел бы как-то заполнить несколько столбцов данных в одном выражении.

Ответы [ 4 ]

4 голосов
/ 11 апреля 2019

Без изменения вашего текущего SlowFunction одним из способов является использование do

library(dplyr)

iris %>% 
   group_by(Species) %>% 
   do(data.frame(SlowFunction(.$Sepal.Length)))

#  Species     mean    sd
#  <fct>      <dbl> <dbl>
#1 setosa      5.01 0.352
#2 versicolor  5.94 0.516
#3 virginica   6.59 0.636

или с group_split + purrr::map_dfr

bind_cols(Species = unique(iris$Species), iris %>%
     group_split(Species) %>%
     map_dfr(~SlowFunction(.$Sepal.Length)))
3 голосов
/ 11 апреля 2019

Мы можем изменить SlowFunction для возврата tibble и

SlowFunction = function(vector){
  tibble(
     mean =mean(vector),
      sd  = sd(vector)
     )
   }

, а затем unnest summarise вывода в list

iris %>% 
    group_by(Species) %>% 
    summarise(out = list(SlowFunction(Sepal.Length))) %>%
    unnest
# A tibble: 3 x 3
#  Species     mean    sd
#  <fct>      <dbl> <dbl>
#1 setosa      5.01 0.352
#2 versicolor  5.94 0.516
#3 virginica   6.59 0.636
3 голосов
/ 11 апреля 2019

Мы можем использовать group_map, если вы используете dplyr 0.8.0 или позже.Вывод SlowFunction необходимо преобразовать во фрейм данных.

library(dplyr)

iris %>% 
  group_by(Species) %>% 
  group_map(~SlowFunction(.x$Sepal.Length) %>% as.data.frame())
# # A tibble: 3 x 3
# # Groups:   Species [3]
#   Species     mean    sd
#   <fct>      <dbl> <dbl>
# 1 setosa      5.01 0.352
# 2 versicolor  5.94 0.516
# 3 virginica   6.59 0.636
3 голосов
/ 11 апреля 2019

Можно использовать для сохранения вывода SlowFunction в столбце list data.frame с, а затем использовать unnest

iris %>%
    group_by(Species) %>%
    summarise(res = list(as.data.frame(SlowFunction(Sepal.Length)))) %>%
    unnest()
## A tibble: 3 x 3
#  Species     mean    sd
#  <fct>      <dbl> <dbl>
#1 setosa      5.01 0.352
#2 versicolor  5.94 0.516
#3 virginica   6.59 0.636
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...