我有3张桌子
tbl.1 <- data.table("A" = runif(5), "B" = runif(5))
tbl.2 <- data.table("A" = runif(5), "B" = runif(5))
tbl.3 <- data.table("A" = runif(5), "B" = runif(5))
我想用循环遍历这些表,例如
for (i in 1:3) {
# Open tbl.i
# Do something
}
如何做到这一点?我可以把表放在一个列表中迭代通过列表工作正常。但是,由于各种原因,我试图将表保留为唯一对象。 谢谢。
答案 0 :(得分:3)
如果您不想将data.tables保留在列表中。您可以在您的环境中引用它们。在这个例子中,它是一个全球环境。如果您的data.tables将填充在其他包中,那么您将需要更改环境。
library(data.table)
tbl.1 <- data.table("A" = runif(5), "B" = runif(5))
tbl.2 <- data.table("A" = runif(5), "B" = runif(5))
tbl.3 <- data.table("A" = runif(5), "B" = runif(5))
for (i in paste0("tbl.",1:3)) {
# Open tbl.i: get
# Do something: str
str(get(i, envir = .GlobalEnv))
}
答案 1 :(得分:0)
正如其他人已经指出的那样,这似乎不是“data.table”的做事方式,而且当你说“做某事”时你还不是很清楚你在做什么,这很难提出一个好的建议。
也就是说,如果您的“做某事”完全是通过引用进行分配(例如,使用for
或set
),则:=
循环可能没问题。
这可以通过简单的方式完成:
tbl.1 <- data.table("A" = runif(5), "B" = runif(5))
tbl.2 <- data.table("A" = runif(5), "B" = runif(5))
tbl.3 <- data.table("A" = runif(5), "B" = runif(5))
x <- ls(pattern = "tbl")
for (i in seq_along(x)) {
get(x[i])[, C := A + B]
}
tbl.2
如果您没有处理可通过引用分配解决的问题,例如您要对数据进行分类或汇总,并希望替换原始data.table
,那么您需要使用{{ 1}}和get
。 (唉。)
assign
答案 2 :(得分:0)
LDBerriz,
我相信通过循环变量名称并从.GlobalEnv获取它们可以做你想要做的事情.GlobalEnv代表工作区。
但是,我建议,正如其他几位评论者所说的那样,将表存储在列表中并循环遍历列表要比在.GlobalEnv中循环变量容易得多:
SPANROWS
为了这个答案,我假设这些表实际上是不同的,或者你有一些理由,它们需要是单独的表。当然,如果表的列都是相同类型的数据/变量,如示例中的tbl.1,tbl.2和tbl.3,则可以将它们组合到一个表中并对其进行处理。一张桌子:
tbl.1 <- data.table("A" = runif(5), "B" = runif(5))
tbl.2 <- data.table("A" = runif(5), "B" = runif(5))
tbl.3 <- data.table("A" = runif(5), "B" = runif(5))
tblList <- list(tbl.1, tbl.2, tbl.3)
for (i in 1:3) {
tbl <- tblList[[i]]
# Do something with tbl.
}
您甚至可以为它们添加一列,以便您可以根据需要确定它们最初来自哪个表:
masterTbl <- rbind(tbl.1,tbl.2,tbl.3)
最佳, 本。
答案 3 :(得分:0)
或者,可以仅将ls()
命令与某个模式结合使用,以便人们可以直接选择所需的表。发现它变得更容易,更通用。我还遇到了一个问题,就是合并的data.tables太大了,所以我不得不求助于将它们拆分开来,然后分别访问它们。
for (tbl in ls(pattern = glob2rx("tbl.*"))) {
str(get(tbl))
}