使用lapply over data.tables列表将列表成员名称指定为变量

时间:2015-03-12 11:46:16

标签: r list data.table apply

我有一个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。这甚至是正确的策略吗?

3 个答案:

答案 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
相关问题