我有一个data.tables列表
library(data.table)
set.seed(27)
test <- list()
test$a <- data.table(x = rnorm(n = 10),
y = rnorm (n = 10))
test$b <- data.table(x = rnorm(n = 10),
y = rnorm (n = 10))
列表的每个成员都有一个唯一的名称
test
为了准备将这些多个表附加到单个“long”格式中,我想创建一个第三列,它是一个变量,它是通过函数的每个成员的名称(我将需要定期执行此操作)。 / p>
目前工作(但不正确)代码:
lName.asVariable <- function(dataTableList) {
dataTableList <- lapply(X = dataTableList, FUN = function(x)(x[, Site :=names(dataTableList)]))
}
test <- lName.asVariable(test)
test
哪个输出
$a
x y Site
1: 1.907162564 -1.28512736 a
2: 1.144876890 0.03482725 b
3: -0.764530737 1.57029534 a
4: -1.457432503 0.15801005 b
...
$b
x y Site
1: -0.57488122 -0.1520452 a
2: -1.15190000 -0.9589459 b
3: 0.08706853 1.8582198 a
4: -0.07018075 -1.5747647 b
...
虽然我想要的是
$a
x y Site
1: 1.907162564 -1.28512736 a
2: 1.144876890 0.03482725 a
3: -0.764530737 1.57029534 a
4: -1.457432503 0.15801005 a
...
$b
x y Site
1: -0.57488122 -0.1520452 b
2: -1.15190000 -0.9589459 b
3: 0.08706853 1.8582198 b
4: -0.07018075 -1.5747647 b
...
阅读extract names of objects from list seq_along
可能是我需要的,但以下代码会产生错误:
lName.asVariable <- function(dataTableList) {
dataTableList <- lapply(X = seq_along(dataTableList), FUN = function(x)(x[, Site := names(dataTableList)]))
}
test <- lName.asVariable(test)
test
虽然我没有足够清楚地知道如何打包seq_along
来正确引用data.table
。这甚至是正确的策略吗?
答案 0 :(得分:6)
seq_along
生成一系列从1到列表长度的数字。然后,您可以使用中间索引变量来引用列表项和names
项:
lapply(seq_along(test), function(i) test[[i]][,Site:=names(test[i])])
[[1]]
x y Site
1: 1.907162564 -1.28512736 a
2: 1.144876890 0.03482725 a
3: -0.764530737 1.57029534 a
4: -1.457432503 0.15801005 a
5: -1.093468881 -0.74579947 a
6: 0.295241218 -1.06880297 a
7: 0.006885942 -1.62743793 a
8: 1.157410886 -1.06858164 a
9: 2.134637891 -0.02583971 a
10: 0.237844613 0.31957639 a
[[2]]
x y Site
1: -0.57488122 -0.1520452 b
2: -1.15190000 -0.9589459 b
3: 0.08706853 1.8582198 b
4: -0.07018075 -1.5747647 b
5: -2.99830401 -0.3981480 b
6: -1.22399491 0.9686850 b
7: -0.99707477 0.6711891 b
8: 0.33571390 0.6788910 b
9: 1.29534374 -0.1739613 b
10: 0.32775994 0.7890292 b
请注意,lapply的输出会丢失名称,因此您必须手动恢复它们。
答案 1 :(得分:4)
如果最终目标是将它们合并为一个data.table
,那么在最新版本(1.9.5+)中,您可以一步完成所有操作:
rbindlist(test, idcol = 'Site')
# Site x y
# 1: a 1.907162564 -1.28512736
# 2: a 1.144876890 0.03482725
# 3: a -0.764530737 1.57029534
# 4: a -1.457432503 0.15801005
# 5: a -1.093468881 -0.74579947
# 6: a 0.295241218 -1.06880297
# 7: a 0.006885942 -1.62743793
# 8: a 1.157410886 -1.06858164
# 9: a 2.134637891 -0.02583971
#10: a 0.237844613 0.31957639
#11: b -0.574881218 -0.15204521
#12: b -1.151900001 -0.95894585
#13: b 0.087068535 1.85821984
#14: b -0.070180754 -1.57476470
#15: b -2.998304014 -0.39814797
#16: b -1.223994910 0.96868503
#17: b -0.997074773 0.67118912
#18: b 0.335713896 0.67889104
#19: b 1.295343743 -0.17396132
#20: b 0.327759944 0.78902925
答案 2 :(得分:0)
我不知道这种方式对你有用。但如果你想要结果,我相信以下是简单的方法,
library(data.table)
set.seed(27)
test <- list()
test$a <- data.table(x = rnorm(n = 10),
y = rnorm (n = 10))
test$b <- data.table(x = rnorm(n = 10),
y = rnorm (n = 10))
test
test$a$Site <- "a"
test$b$Site <- "b"
test
$a
x y Site
1: 1.907162564 -1.28512736 a
2: 1.144876890 0.03482725 a
3: -0.764530737 1.57029534 a
4: -1.457432503 0.15801005 a
5: -1.093468881 -0.74579947 a
6: 0.295241218 -1.06880297 a
7: 0.006885942 -1.62743793 a
8: 1.157410886 -1.06858164 a
9: 2.134637891 -0.02583971 a
10: 0.237844613 0.31957639 a
$b
x y Site
1: -0.57488122 -0.1520452 b
2: -1.15190000 -0.9589459 b
3: 0.08706853 1.8582198 b
4: -0.07018075 -1.5747647 b
5: -2.99830401 -0.3981480 b
6: -1.22399491 0.9686850 b
7: -0.99707477 0.6711891 b
8: 0.33571390 0.6788910 b
9: 1.29534374 -0.1739613 b
10: 0.32775994 0.7890292 b