Я изучаю пакет Tidyverse.Поэтому меня интересует, как выполнить следующую задачу аккуратно.Можно легко обойти проблему, используя *apply
функции.
Рассмотрим следующие данные
tb <-
lapply(matrix(c("a", "b", "c")), function(x)
rep(x, 3)) %>% unlist %>% c(rep(c(1, 2, 3), 6)) %>% matrix(ncol = 3) %>%
as_tibble(.name_repair = ~ c("tag", "x1", "x2")) %>% type.convert()
# A tibble: 9 x 3
tag x1 x2
<fct> <int> <int>
1 a 1 1
2 a 2 2
3 a 3 3
4 b 1 1
5 b 2 2
6 b 3 3
7 c 1 1
8 c 2 2
9 c 3 3
Я группирую их, используя функцию nest()
, и для каждой группы я хочу применить свою функциюиз списка функций f_1, f_2, f_3
f_1 <- function(x)
x[,1] + x[,2]
f_2 <- function(x)
x[,1] - x[,2]
f_3 <- function(x)
x[,1] * x[,2]
tb_func_attached <-
tb %>% group_by(tag) %>% nest() %>% mutate(func = c(f_0, f_1, f_2))
# A tibble: 3 x 3
tag data func
<fct> <list> <list>
1 a <tibble [3 x 2]> <fn>
2 b <tibble [3 x 2]> <fn>
3 c <tibble [3 x 2]> <fn>
Я пытаюсь использовать invoke_map для применения функций
tb_func_attached %>% {invoke_map(.$func, .$data)}
invoke_map(tb_func_attached$func, tb_func_attached$data)
Но я получаю ошибку Error in (function (x) : unused arguments (x1 = 1:3, x2 = 1:3)
, пока выполняется следующий код
> tb_func_attached$func[[1]](tb_func_attached$data[[1]])
x1
1 2
2 4
3 6
> tb_func_attached$func[[2]](tb_func_attached$data[[2]])
x1
1 0
2 0
3 0
> tb_func_attached$func[[3]](tb_func_attached$data[[3]])
x1
1 1
2 4
3 9
Но invoke_map
по-прежнему не работает.
Таким образом, вопрос, учитывая вложенные данные tb_func_attached
, как применить функции tb_func_attached$func
'rowwise' к tb_func_attached$data
?
И дополнительный вопрос, в чем причина выхода на пенсию invoke_map
?Это вполне вписывается в концепцию ветеринарии, IMHO.
Обновление:
Предыдущая версия работала с данными из одного столбца (tb
имеет только тег и x1
столбцы) и @A,Комментарий Сулимана дает решение.
Однако, когда столбец данных во вложенной таблице имеет матричную структуру, код прекращает работу снова.