R: объединить список фреймов данных в один фрейм данных, добавить столбец с индексом списка.


person Jose R    schedule 10.05.2015    source источник


Ответы (3)


Попробуйте data.table::rbindlist

library(data.table) # v1.9.5+
rbindlist(dfList, idcol = "index")
#     index a           b            c
#  1:     1 g  1.27242932 -0.005767173
#  2:     1 j  0.41464143  2.404653389
#  3:     1 o -1.53995004  0.763593461
#  4:     1 x -0.92856703 -0.799009249
#  5:     1 f -0.29472045 -1.147657009
#  6:     2 k -0.04493361  0.918977372
#  7:     2 a -0.01619026  0.782136301
#  8:     2 j  0.94383621  0.074564983
#  9:     2 w  0.82122120 -1.989351696
# 10:     2 i  0.59390132  0.619825748
# 11:     3 m -1.28459935 -0.649471647
# 12:     3 w  0.04672617  0.726750747
# 13:     3 l -0.23570656  1.151911754
# 14:     3 g -0.54288826  0.992160365
# 15:     3 b -0.43331032 -0.429513109
person David Arenburg    schedule 10.05.2015

Вы можете сделать это в базе:

df[["index"]] <- rep(seq_along(dfList), sapply(dfList, nrow))
df

##    a           b            c index
## 1  g  1.27242932 -0.005767173     1
## 2  j  0.41464143  2.404653389     1
## 3  o -1.53995004  0.763593461     1
## 4  x -0.92856703 -0.799009249     1
## 5  f -0.29472045 -1.147657009     1
## 6  k -0.04493361  0.918977372     2
## 7  a -0.01619026  0.782136301     2
## 8  j  0.94383621  0.074564983     2
## 9  w  0.82122120 -1.989351696     2
## 10 i  0.59390132  0.619825748     2
## 11 m -1.28459935 -0.649471647     3
## 12 w  0.04672617  0.726750747     3
## 13 l -0.23570656  1.151911754     3
## 14 g -0.54288826  0.992160365     3
## 15 b -0.43331032 -0.429513109     3

Вы также можете сделать:

library(qdapTools)
list_df2df(setNames(dfList, 1:3), "index")

##    index a           b            c
## 1      1 g  1.27242932 -0.005767173
## 2      1 j  0.41464143  2.404653389
## 3      1 o -1.53995004  0.763593461
## 4      1 x -0.92856703 -0.799009249
## 5      1 f -0.29472045 -1.147657009
## 6      2 k -0.04493361  0.918977372
## 7      2 a -0.01619026  0.782136301
## 8      2 j  0.94383621  0.074564983
## 9      2 w  0.82122120 -1.989351696
## 10     2 i  0.59390132  0.619825748
## 11     3 m -1.28459935 -0.649471647
## 12     3 w  0.04672617  0.726750747
## 13     3 l -0.23570656  1.151911754
## 14     3 g -0.54288826  0.992160365
## 15     3 b -0.43331032 -0.429513109
person Tyler Rinker    schedule 10.05.2015

Это решение dplyr, которое делает именно то, что вы ищете:

dfList <- NULL
set.seed(1)
for (i in 1:3) {
  dfList[[i]] <- data.frame(a=sample(letters, 5, rep=T), b=rnorm(5), c=rnorm(5))
}

df <- dplyr::bind_rows(dfList, .id = "index")
person Scott Worland    schedule 20.12.2017