将数据帧列表转换为数据 table

Converting list of data frames to a data table

我有一个数据框列表,例如:

listOfDataFrames <- vector("list", 10)

for (i in 1:10) {
    listOfDataFrames[[i]] <- data.frame(a=rnorm(50), b=rnorm(50))
}

我想制作一个包含 3 列 (a,b,c) 的数据 table,其中 a 和 b 是上面数据框的列,c 是 listOfDataframes 中数据框的索引.

我会做类似下面的事情:

library(data.table)
Lens <- vapply(listOfDataframes, nrow, 1L)
rbindlist(listOfDataframes)[, c := rep(seq_along(Lens), times = Lens)][]
#               a          b  c
#   1: -1.6462894  1.0232899  1
#   2: -0.5145108 -0.2134384  1
#   3: -0.1171853  2.5456709  1
#   4:  0.2735289  1.1948928  1
#   5:  0.5739892  0.3939964  1
#  ---                         
# 496:  0.9539835 -1.4100199 10
# 497: -0.8697604  0.6793800 10
# 498:  0.8601795 -0.3015890 10
# 499:  0.8306091 -2.2269960 10
# 500: -1.3407596  0.5014448 10

基本上,"Lens" 只是算出每个列表项中有多少行(在本例中,每个列表项有 50 行),然后您只需使用 rep 来计算列的值"c"。因为rbindlist的结果是data.table,你可以直接用:=在复合语句中给"c"赋值。


有了 development version,您现在可以用新的 idcol 参数替换 vapply 部分。 idcol 总是 字符 类型。

rbindlist(listOfDataframes, idcol = "c")

不想破坏 data.table 聚会,但是 tidyr 会是一个单行,尽管您会在列索引中得到一个额外的 X,您可以稍后使用 gsub 删除(如果您愿意)如下:

library(tidyr)
library(data.table)
setDT(unnest(listOfDataframes, "c"))[, c := gsub("X", "", c)][]
#       c          a          b
#   1:  1  0.3852528 -0.6886418
#   2:  1 -2.3344659 -1.6770465
#   3:  1 -0.8241178 -0.1445429
#   4:  1 -1.5560673 -1.4205030
#   5:  1  0.5981992  0.3564583
# ---                         
# 496: 10  0.1460643  1.1055989
# 497: 10  0.3094036 -0.4239363
# 498: 10  0.7756495  0.7656453
# 499: 10  1.0037946 -0.2417804
# 500: 10 -0.1241405  3.2421323

如果需要,您也可以通过引用对列重新排序(如果您保存了此对象,可以在 Res 中说),使用 setcolorder 函数

setcolorder(Res, c(2, 3, 1))