将列表索引添加到bind_rows?

时间:2018-06-13 09:53:33

标签: r dataframe dplyr

我有这些数据:

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

2 个答案:

答案 0 :(得分:5)

data.table解决方案

使用rbindlist(),它具有内置的id-support,支持NULL df。

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。

答案 1 :(得分:4)

根据bind_rows()的文档,您可以提供函数的.id参数的名称。将bind_rows()应用于data.frame列表时,包含data.frame的列表的名称将分配给标识符列。 [编辑]但@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")