【问题标题】:Is there a way to generate a dataframe consisting of elements in a list within a list using lapply?有没有办法使用 lapply 生成由列表中列表中的元素组成的数据框?
【发布时间】:2021-05-14 08:49:39
【问题描述】:

我想在列表中的列表中索引一个向量,并生成一个新的数据框,其中包含每一行的每个列表中的特定向量。我之前正在考虑使用 for 循环来这样做

a = list(odds = c(1,3,5,7), evens = c(2,4,6,8), name = "name1")
b = list(odds = c(9,11,13,15), evens = c(10,12,14,16), name = "name2")
c = list(odds = c(17,19,21,23), evens = c(18,20,22,24), name = "name3")

d = list(a,b,c)

output = data.frame()
for (i in 1:length(d)) {
output <- rbind(output, d[[i]]$odds)
}

预期的输出是这样的

#   X1 X3 X5 X7  
# 1  1  3  5  7  
# 2  9 11 13 15  
# 3 17 19 21 23  

但是,由于我在处理数据时始终需要进行此类索引,因此我想知道是否有一种不那么复杂的方法来执行此操作。是否有更清洁的方法使用lapplyrbind 函数来避免循环?我不知道如何索引所需的向量。

抱歉,如果问题格式不正确,这是我第一次在编码论坛上发帖。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用:

    res <- data.frame(t(sapply(d, `[[`, 'odds')))
    
    #  X1 X2 X3 X4
    #1  1  3  5  7
    #2  9 11 13 15
    #3 17 19 21 23
    

    【讨论】:

    • 嗨 Ronak,不幸的是,我实际使用的列表除了向量之外还有许多其他组件,所以我不能将列表折叠到 data.frame 中。
    • @timetoimprove123 您能否编辑您的帖子以包含共享数据的预期输出?
    • 我已经编辑了这篇文章,以便在我的数据集中添加一个额外的列表元素
    • @timetoimprove123 谢谢,请参阅更新的答案。
    【解决方案2】:

    我们可以使用

    library(dplyr)
    library(purrr)
    d %>% 
      transpose %>%
      pluck('odds') %>%
      invoke(rbind, .)
    #     [,1] [,2] [,3] [,4]
    #[1,]    1    3    5    7
    #[2,]    9   11   13   15
    #[3,]   17   19   21   23
    

    【讨论】:

      【解决方案3】:

      这也可以使用,尽管与亲爱的@akrun 发布的非常相似。 map 系列函数也接受整数或字符向量来代替匿名函数或公式。在这种情况下,它通过索引(整数)或名称(字符)充当提取函数。然后它在内部调用@akrun 解决方案指定的pluck。您可以通过as_mapper("odds")进行验证。

      library(purrr)
      
      # We use big bang operator to splice the list of arguments and then
      # use exec to apply `rbind` function to the spliced list.
      
      exec(rbind, !!!map(d, "odds"))
      
           [,1] [,2] [,3] [,4]
      [1,]    1    3    5    7
      [2,]    9   11   13   15
      [3,]   17   19   21   23
      

      【讨论】:

        【解决方案4】:

        另一个使用simplify2array的基本R选项

        > t(do.call(cbind, simplify2array(d)["odds", ]))
             [,1] [,2] [,3] [,4]
        [1,]    1    3    5    7
        [2,]    9   11   13   15
        [3,]   17   19   21   23
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-19
          • 1970-01-01
          • 2015-07-30
          • 2012-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多