rbind список, возвращаемый функцией без l oop в R - PullRequest
3 голосов
/ 27 марта 2020

В R, для функции, чья входная переменная - одна переменная, а выходная - это список, как я могу применить функцию к списку входных данных и объединить выходные списки в один кадр данных или матрицу?

Для пример:

fun = function(x){
    list = c(x, x+1, x+2)
    return(list)
}

Теперь я хотел бы применить fun () к списку, скажем

list = c(1,11,21)

Результат должен быть

1,2,3
11,12,13
21,22,23

Я знаю do.call и l oop сделает это. Но есть ли лучший способ сделать это, возможно, без зацикливания? Реальная функция слишком большая и слишком медленная, я бы не стал ее зацикливать.

Ответы [ 3 ]

2 голосов
/ 27 марта 2020

Если вы хотите матрицу, вероятно, достаточно sapply.

lst <- c(1,11,21)  ## don't use `list` since it is a function name!

t(sapply(lst, fun))
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]   11   12   13
# [3,]   21   22   23
2 голосов
/ 27 марта 2020

Вот несколько базовых решений R:

  • Простой вариант - использовать Vectorize + t, т. Е.
t(Vectorize(fun)(list))

, например

> t(Vectorize(fun)(list))
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]   11   12   13
[3,]   21   22   23
  • Другой способ - использовать replicate (учитывая аддитивное свойство вашей функции fun), т. Е.
t(replicate(length(list),fun(0)))+list

, такой что

> t(replicate(length(list),fun(0)))+list
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]   11   12   13
[3,]   21   22   23
2 голосов
/ 27 марта 2020

Мы можем использовать lapply:

do.call(rbind, lapply(list, fun))

#     [,1] [,2] [,3]
#[1,]    1    2    3
#[2,]   11   12   13
#[3,]   21   22   23

Вместо числового c вектора, если вы возвращаете именованный список, вы можете использовать map.* функции из purrr.

fun = function(x){
  list = list(a = x, b = x+1, c = x+2)
  return(list)
}

purrr::map_df(list, fun)
#OR
#purrr::map_dfr(list, fun)

#     a     b     c
#  <dbl> <dbl> <dbl>
#1     1     2     3
#2    11    12    13
#3    21    22    23
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...