Как использовать rowwise () dplyr в конвейере в R, чтобы применить функцию, которая возвращает список для каждой строки?

Я хотел бы использовать rowwise () и конвейер dplyr для применения функции (которая возвращает список) к каждой строке в кадре данных.

Тестовый набор данных с двумя строками:

test_tbl <- tibble(a=c(2, 4), b=c(0, 8), c=c(5, -3))

Определение простой функции (речь идет о функции, возвращающей список, очевидно, не о добавлении 8):

simple_function <- function(input) {
  list(input + 8)
}

Вот чего я хотел бы добиться:

apply(test_tbl ,1, function (x) simple_function(x))

который возвращает список из 2 списков (мой желаемый результат).

Я хотел бы сохранить эти списки в виде столбца в таблице. Мы могли сделать:

test_tbl %>% mutate(output = apply(. ,1, function (x) simple_function(x)))

Я бы предпочел использовать dplyr, чем смешивать dplyr, base и pipe (также для удобочитаемости кода), но я не понимаю, почему это не работает:

test_tbl %>% rowwise() %>% simple_function
test_tbl %>% rowwise() %>% mutate(output = simple_function(.))

Обе эти функции применяют функцию ко всему кадру данных, а не к отдельным строкам. Для меня не имеет смысла, что: test_tbl %>% rowwise() %>% simple_function идентично (с точки зрения вывода) test_tbl %>% simple_function

Это дает желаемый результат, но я считаю его довольно подробным и не идеальным, что мне нужно самому связывать столбцы:

test_tbl %>% rowwise() %>% do(output= simple_function(.)) %>% bind_cols(test_tbl, .)

Любая помощь в том, почему rowwise() терпит неудачу, очень ценится.


person Gert    schedule 25.09.2017    source источник
comment
Нам нужен test_tbl %>% mutate_all(funs(. + 8)). Непонятно, почему на выходе должен быть list. Если это не так, просто добавьте в mutate_all   -  person akrun    schedule 25.09.2017
comment
Простая функция является примером; функция, которую я хотел бы применить, представляет собой нечто более сложное (которое генерирует некоторый фрейм данных на основе значений столбца). Решающим моментом является то, что должен быть сформирован столбец списка со списком, созданным для каждой строки.   -  person Gert    schedule 25.09.2017


Ответы (1)


Если нам нужно сделать это для каждой строки, тогда split и примените функцию в map

library(tidyverse)
test_tbl %>% 
    split(., seq_len(nrow(.))) %>%
    map(simple_function)
#$`1`
#$`1`[[1]]
#   a b  c
#1 10 8 13


#$`2`
#$`2`[[1]]
#   a  b c
#1 12 16 5
person akrun    schedule 25.09.2017