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

时间:2015-01-25 10:01:51

标签: r dataframe 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)的数据表,其中a和b是上面数据帧的列,c是listOfDataframes中数据帧的索引。

2 个答案:

答案 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}}