【问题标题】:rbind the list returned from a function without loop in Rrbind 从 R 中没有循环的函数返回的列表
【发布时间】:2020-07-07 23:14:18
【问题描述】:

在 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 和循环会做到这一点。但是有没有更好的方法,也许没有循环?实际函数太大太慢,我宁愿不循环。

【问题讨论】:

    标签: r loops dataframe rbind


    【解决方案1】:

    以下是一些基本的 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
    

    【讨论】:

    • 语法Vectorize(fun)(lst) 让我印象深刻,它是如何工作的? "Vectorize(fun)" 好像是新的函数名?
    • @jay.sf 好吧...我不知道如何详细解释它...fun是一个正在矢量化的对象名称,相当于fun <- Vectorize(function (x) ...)
    【解决方案2】:

    如果你想要一个矩阵,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
    

    【讨论】:

      【解决方案3】:

      我们可以使用lapply

      do.call(rbind, lapply(list, fun))
      
      #     [,1] [,2] [,3]
      #[1,]    1    2    3
      #[2,]   11   12   13
      #[3,]   21   22   23
      

      如果您返回一个命名列表,您可以使用来自purrrmap.* 函数,而不是数字向量。

      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
      

      【讨论】:

        猜你喜欢
        • 2019-05-08
        • 2019-03-31
        • 1970-01-01
        • 2019-06-29
        • 2017-08-23
        • 1970-01-01
        • 2018-06-21
        • 2021-01-06
        • 2019-03-24
        相关资源
        最近更新 更多