将list的索引添加到bind_rows?

Posted

技术标签:

【中文标题】将list的索引添加到bind_rows?【英文标题】:Add the index of list to bind_rows? 【发布时间】:2018-11-22 20:39:30 【问题描述】:

我有这些数据:

dat=list(structure(list(Group.1 = structure(3:4, .Label = c("A","B", "C", "D", "E", "F"), class = "factor"), Pr1 = c(65, 75)), row.names = c(NA, -2L), class = "data.frame"),NULL, structure(list( Group.1 = structure(3:4, .Label = c("A","B", "C", "D", "E", "F"), class = "factor"), Pr1 = c(81,4)), row.names = c(NA,-2L), class = "data.frame"))

我想使用 bind_rows(dat) 组合,但将索引号保留为变量 输出包括Type([[1]] and [[3]])

  type   Group.1     Pr1
1   1      C          65
2   1      D         75
3   3      C         81
4   3      D          4

【问题讨论】:

【参考方案1】:

data.table 解决方案

使用 data.table-package 中的 rbindlist(),它具有尊重 NULL df 的内置 id-support。

library(data.table)
rbindlist( dat, idcol = TRUE )

   .id Group.1 Pr1
1:   1       C  65
2:   1       D  75
3:   3       C  81
4:   3       D   4

dplyr - 部分解决方案

bind_rows 也支持 ID,但它会“跳过”空元素...

bind_rows( dat, .id = "id" )

  id Group.1 Pr1
1  1       C  65
2  1       D  75
3  2       C  81
4  2       D   4

请注意,来自 dat 的第三个元素的 ID 变为 2,而不是 3。

【讨论】:

bind_rows(setNames(dat, seq_along(dat)), .id = "id") 不跳过。【参考方案2】:

根据bind_rows() 的文档,您可以为函数的.id 参数提供名称。当您将bind_rows() 应用于data.frames 列表时,包含您的data.frames 的列表的名称将分配给标识符列。 [编辑] 但是@Wimpel 提到了一个问题:

names(dat)
NULL

但是,将名称提供给列表会起作用:

names(dat) <- 1:length(dat)
names(dat)
[1] "1" "2" "3"
bind_rows(dat, .id = "type")
  type Group.1 Pr1
1    1       C  65
2    1       D  75
3    3       C  81
4    3       D   4

如果您愿意,也可以在一行中:

bind_rows(setNames(dat, seq_along(dat)), .id = "type")

【讨论】:

以上是关于将list的索引添加到bind_rows?的主要内容,如果未能解决你的问题,请参考以下文章

List.Add 正在替换索引 0 而不是添加到下一个位置。为啥?

如何在列表中的特定索引中添加条目?

将对象添加到指定索引处的 ArrayList

将带有字符串索引的运行数字添加到 Spark 中的数据框?

R语言将多个dataframe数据添加在列表(list)结构中并进行列表dataframe的索引:包含dataframe的列表包含dataframe的列表的索引

如何在不重新索引的情况下将项目添加到 laravel 列表集合中?