【发布时间】:2015-05-14 13:25:15
【问题描述】:
我有一个 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
在准备将这些多个表附加到单个“长”格式中,我想创建第三列,它是一个变量,它是通过函数的每个成员的名称(我需要定期执行此操作)。
当前工作(虽然不正确)代码:
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。这甚至是正确的策略吗?
【问题讨论】:
-
使用
mapply(或Map)传递表格和名称:Map(function(x,.y)(x[, Site :=.y]), test, names(test)) -
如果您考虑将
rbind列表添加到单个数据框,请尝试rbindlist(test, idcol=TRUE),它将列表元素的名称作为新的.id列 -
@nicola - 谢谢,效果很好,虽然我对
.y的使用感到困惑,而不仅仅是y -
@akun - 恐怕对上面的数据执行此操作会给我一个错误。
Error in rbindlist(test, idcol = TRUE) : unused argument (idcol = TRUE)我发现了 rbindlist{data.table},尽管唯一记录在案的参数似乎是use.names和fill -
@DaveRGP 我使用的是
devel版本。我想这是最近介绍的。如果你想安装开发版,这里是链接github.com/Rdatatable/data.table/wiki/Installation
标签: r list data.table apply