2016-01-14 2 views
0

у меня есть 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 
} 

Как это можно сделать? Я могу поместить таблицы в список итерации по списку, который работает нормально. Тем не менее, я пытаюсь сохранить таблицы как уникальные объекты по разным причинам. Спасибо.

+1

Пожалуйста, конкретны, как к тому, что вы хотите сделать, вместо 'Do something'.Кроме того, если вы можете использовать 'set.seed' и ожидаемый результат, ответы могут быть конкретными. – akrun

+1

Как сказал rawr: не делайте этого. Скорее 'my_tbl = rbind (tbl.1, tbl.2, tbl.3, idcol = TRUE); my_tbl [, {... do stuff ...}, by = .id] ', предполагая, что операции над каждой таблицей в цикле независимы. – Frank

+0

R не настроен для этого, R настроен для работы с кадрами данных в списках. Вот почему нет хорошего/легкого ответа на вопрос, который вы задаете. Почему вам нужны уникальные объекты? Я был бы удивлен, если бы это было так. –

ответ

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

Действительно! и если вы хотите предоставить им свою собственную среду, они создаются с помощью 'new.env()' – Ward9250

+1

Кроме того, это может быть не так, как вы ожидаете, если вы измените вещи: http://stackoverflow.com/questions/31120295/r -variable-names-in-loop-get-etc/31122283 # 31122283 – Ward9250

+0

@ Ward9250 Хорошая точка. С data.table как-то проще, поскольку вы обычно хотите изменить по ссылке, иначе 'copy()' всегда можно использовать. – jangorecki

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, тогда вам нужно будет использовать get и assign. (Тьфу.)

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)) { 
    assign(x[i], get(x[i])[1, ]) 
} 
+0

Я согласен, что это не способ использования данных data.table. Единственная причина, по которой эти таблицы разделены, состоит в том, что каждая таблица довольно большая, и объединение их в список создает очень большой объект, который потребляет ОЗУ. Спасибо всем за хорошие ответы. – LDBerriz

0

LDBerriz,

Я считаю, что это можно делать то, что вы пытаетесь сделать, обернув через имена переменных и получать их от .GlobalEnv, который представляет рабочее пространство.

Однако, я полагаю, как и несколько других комментаторов есть, это гораздо проще хранить ваши таблицы в списке, и цикл по списку, чем к перебрать переменные в .GlobalEnv:

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

Ради этого ответа я предполагаю, что таблицы на самом деле разные, или есть некоторые причины, по которым у вас есть, что они должны быть отдельными таблицами. Конечно, если в столбцах таблиц были все одинаковые данные/переменные, например, tbl.1, tbl.2 и tbl.3 в вашем примере, вы могли бы просто объединить их в одну таблицу и сделать материал для одна таблица:

masterTbl <- rbind(tbl.1,tbl.2,tbl.3) 

можно даже добавить столбец к ним, так что вы можете определить, какая таблица первоначально они пришли, если вам необходимо:

tbl.1$from <- 1 
tbl.2$from <- 2 
tbl.3$from <- 3 

masterTbl <- rbind(tbl.1,tbl.2,tbl.3) 

Бест, Бен.