我有一个数据框列表,例如:
listOfDataFrames <- vector("list", 10)
for (i in 1:10) {
listOfDataFrames[[i]] <- data.frame(a=rnorm(50), b=rnorm(50))
}
我想创建一个包含3列(a,b,c)的数据表,其中a和b是上面数据帧的列,c是listOfDataframes中数据帧的索引。
答案 0 :(得分:4)
我会做以下事情:
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
基本上,&#34;镜头&#34;只计算出每个列表项中有多少行(在这种情况下,每个列表中有50行),然后你只需使用rep
来计算列的值&#34; c&#34;。由于rbindlist
的结果是data.table
,因此您只需使用:=
来指定&#34; c&#34;的值。在复合声明中。
使用development version,您现在可以使用新的vapply
参数替换idcol
部分。 idcol
始终为字符类型。
rbindlist(listOfDataframes, idcol = "c")
答案 1 :(得分:3)
不想破坏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))
函数
{{1}}