#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()