invoke_map имеет трудности с поиском аргументов - PullRequest
0 голосов
/ 13 июня 2019

Я изучаю пакет 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,Комментарий Сулимана дает решение.

Однако, когда столбец данных во вложенной таблице имеет матричную структуру, код прекращает работу снова.

1 Ответ

0 голосов
/ 18 июня 2019

Используйте map2, чтобы перебрать сначала список функций, а затем столбец данных.Вот так:

tb_func_attached %>% 
  mutate(output = map2(func, data, ~ .x(.y))) %>% 
  unnest(data, output)

Вывод выглядит так:

# A tibble: 9 x 4
  tag      x1    x2   x11
  <fct> <int> <int> <int>
1 a         1     1     2
2 a         2     2     4
3 a         3     3     6
4 b         1     1     0
5 b         2     2     0
6 b         3     3     0
7 c         1     1     1
8 c         2     2     4
9 c         3     3     9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...