【问题标题】:bind_rows with a large number of tibbles带有大量小标题的 bind_rows
【发布时间】:2021-01-18 20:44:25
【问题描述】:

我有大量的小标题,我想使用 dplyr 的 bind_rows 命令将它们组合成一个小标题。所有小标题都有相同的列标题。我想避免在命令中输入所有小标题的名称。这些小标题的命名约定有一个明显的模式。这是长手版本:

all <- distinct(bind_rows(
          level1_1, level1_2, level1_3, level1_4, level1_5, level1_6, level1_7, level1_8,
          level2_2, level2_3, level2_4, level2_5, level2_6, level2_7, level2_8,
          level3_3, level3_4, level3_5, level3_6, level3_7, level3_8,
          level4_4, level4_5, level4_6, level4_7, level4_8,
          level5_5, level5_6, level5_7, level5_8,
          level6_6, level6_7, level6_8,
          level7_7, level7_8,
          level8_8))

不知道有没有更简洁的方式来编写这个命令?

【问题讨论】:

  • 您如何/为什么要创建许多单独的小标题?通常,您会将这些值读入命名列表,而不是在全局环境中创建一堆单独的松散变量,并在其名称中硬编码索引值。如果你先退后一步,可能会有更多类似 R 的方式来做事。
  • @MrFlick 实际上,我昨天确实“退后一步”了几个小时,但未能成功地以列表形式生成此输出。我已经在stackoverflow.com/questions/65794638/loop-output-stored-as-list 发布了这个特殊问题。 “R-like”是什么意思?据我所知,R 是开源的,不受任何特定人的价值观的约束。如果您的意思是“更有效地编码”,那么我同意。

标签: r dplyr


【解决方案1】:

我们可以通过指定patternls返回的字符串对象名称中将对象的值放入listmget

library(dplyr)
out <- distinct(bind_rows(mget(ls(pattern = '^level\\d+_\\d+$'))))

pattern 建议检查全局环境中以“级别”开头 (^)、后跟一个或多个数字 (\\d+)、下划线和一个或多个数字 (@ 987654329@) 直到字符串的结尾 ($)


如果有其他类似模式的对象并想用特定的对象名称对其进行约束,请使用expand.gridpaste创建组合

nm1 <- with(subset(expand.grid(1:8, 1:8), Var1 >= Var2), 
        paste0("level", Var2, "_", Var1))
distinct(bind_rows(mget(nm1)))

【讨论】:

  • 虽然这是处理问题的正确方法如上所述,但重要的是要注意生成这些单独对象的任何代码都应该将它们存储为一个列表对象。然后解决方案简单地变成 dplyr::rbind_list(.) 或 data.table::rbindlist(.) 或 do.call(rbind, .)。
  • @Michael bind_rows from dplyr 继承 rbind_list。我同意它可以存储为列表,不建议在全局环境中创建多个对象
  • @Michael 我同意您的第一条评论如上所述。我已经在 stackoverflow.com/questions/65794638/loop-output-stored-as-list 上发布了这个特殊问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多