迭代数据表

时间:2016-01-14 18:08:19

标签: r loops data.table

我有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
}

如何做到这一点?我可以把表放在一个列表中迭代通过列表工作正常。但是,由于各种原因,我试图将表保留为唯一对象。 谢谢。

4 个答案:

答案 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”的做事方式,而且当你说“做某事”时你还不是很清楚你在做什么,这很难提出一个好的建议。

也就是说,如果您的“做某事”完全是通过引用进行分配(例如,使用forset),则:=循环可能没问题。

这可以通过简单的方式完成:

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))
 }