map_dfc для каждой строки фрейма данных с входными данными

#r #dplyr #statistics #purrr

#r #dplyr #Статистика #purrr

Вопрос:

Я начал изучать использование библиотеки «purrr» и хотел знать, как я буду действовать следующим образом:

Цель

Примените функцию к каждой строке фрейма данных с входными данными в виде столбцов и свяжите выходные данные функции в виде столбца во входном фрейме данных

Идея

Из документации кажется, что map_dfc — это идеальная функция здесь

Попытка решения

 library(purrr)
library(dplyr)

test_func <- function(n, lambda){
  return(n lambda)
}

n <- seq(1,10,1)
lambda <- seq(1, 10, 1)

new_df <- list(n=n,lambda=lambda) %>% cross_df()

new_df <- map_dfc(new_df, test_func)
# even tried the below
# new_df <- map_dfc(new_df, ~test_func) 
  

Ошибка

 Error in .f(.x[[i]], ...) : argument "lambda" is missing, with no default
  

Ответ №1:

purrr Способ — кажется ** — заключался бы в использовании invoke

 new_df %>% 
  mutate(new_col = invoke(test_func, new_df))
# A tibble: 100 x 3
#       n lambda new_col
#   <dbl>  <dbl>   <dbl>
# 1     1      1       2
# 2     2      1       3
# 3     3      1       4
# 4     4      1       5
# 5     5      1       6
# 6     6      1       7
# 7     7      1       8
# 8     8      1       9
# 9     9      1      10
#10    10      1      11
# … with 90 more rows
  

Из файла справки:

Эта пара функций упрощает объединение функции и списка параметров для получения результата. invoke — это оболочка вокруг do.call, которая упрощает его использование в канале.

Так invoke(test_func, new_df) же, как

 test_func(new_df[[1]], new_df[[2]])
  

** В файле справки также указано введите описание изображения здесь


Без purrr пакета

 do.call(test_func, new_df)
  

Ответ №2:

Вам необходимо использовать map2_* семейство функций, поскольку вы walk редактируете два столбца:

 map2_dfc(new_df[1],new_df[2],test_func)
  

Редактировать
Вы можете добиться того же с base помощью Reduce :

  Reduce(test_func,new_df)
 #[1]  2  3  4  5  6  7  8  9 10 11
  

purrr вывод:
Вы можете переименовать свой столбец по мере необходимости:

      n
   <dbl>
 1     2
 2     3
 3     4
 4     5
 5     6
 6     7
 7     8
 8     9
 9    10
10    11
  

Комментарии:

1. Вывод правильный, но почему cbind не произошел в new_df. Может быть, мое понимание этой функции неверно?

2. Эта функция cbind обрабатывает результат, но отбрасывает исходные данные. Вы можете просто добавить его с mutate помощью или просто $ .

Ответ №3:

Расширение того, что сказал пользователь Маркус, rlang::exec() может использоваться как устаревший purrr::invoke()