将数据帧列表转换为数据 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))
我有一个数据框列表,例如:
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))