【问题标题】:rbind data.frames in a list in Rrbind data.frames 在 R 的列表中
【发布时间】:2019-05-19 20:56:59
【问题描述】:

假设我们有 3 个 lists 和 data.frames。在 BASE R 中,我想知道如何在这 3 个列表中自动(例如在循环结构中)rbind data.frames?

请注意我想要循环结构,以便它可以rbind 更多数量的类似列表(例如g4 g5 ...)

g1 <- list(b1 = list(data.frame(a = 1:3, b = 3:5)))
g2 <- list(b1 = list(data.frame(a = 1:3, b = 3:5)))
g3 <- list(b1 = list(data.frame(a = 1:3, b = 3:5)))

【问题讨论】:

    标签: r function loops dataframe rbind


    【解决方案1】:

    这是base R的选项

    do.call(rbind, lapply(mget(ls(pattern = "^g\\d+$")), function(x) x$b1[[1]]))
    

    map

    library(tidyverse)
    mget(ls(pattern = "^g\\d+$"))  %>% 
          map_dfr(~ pluck(., "b1") %>% 
                     extract2(1))
    

    【讨论】:

    • 这取决于标识符的名称-如果您将其命名为h1, h2, h3 , ..,那么它将是ls(pattern = "^h\\d+$")。这里,^ 指定字符串的开头,$ 指定字符串的结尾,匹配 'h' 后跟一个或多个数字(\\d+
    • @rnorouzian 如果你有xyz、'z15'、'g2z` 等,你可能需要自己创建一个字符串标识符的键。或者如果这些是加载到环境中的唯一对象,ls() 就足够了
    【解决方案2】:

    编辑:抱歉,我忽略了你想在 Base R 中解决这个问题

    我不确定这是否正是您想要的,但您可以为此目的使用来自 purrr 的函数 reduce

    library(tidyverse)
    g1 <- list(b1 = list(data.frame(a = 1:3, b = 3:5)))
    g2 <- list(b1 = list(data.frame(a = 1:3, b = 3:5)))
    g3 <- list(b1 = list(data.frame(a = 1:3, b = 3:5)))
    
    reduce(list(g1,g2,g3), rbind) %>%
      as_tibble() %>%
      unnest() %>%
      unnest()
    
    # A tibble: 9 x 2
          a     b
      <int> <int>
    1     1     3
    2     2     4
    3     3     5
    4     1     3
    5     2     4
    6     3     5
    7     1     3
    8     2     4
    9     3     5
    

    【讨论】:

    • OP 可能会寻找 lst &lt;- mget(paste0("g", 1:3)); out &lt;- do.call(rbind, lapply(lst, function(x) x[[1]][[1]])); out
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2019-09-29
    • 2012-11-15
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多