Хранение нескольких кадров данных в одной структуре данных - R

Возможно ли, чтобы несколько кадров данных были сохранены в одну структуру данных и обрабатывать их позже каждым кадром данных? то есть пример

df1 <- data.frame(c(1,2,3), c(4,5,6))
df2 <- data.frame(c(11,22,33), c(44,55,66))

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

 for ( iterate through the data structure) # this gives df1, then df2
 {
    write data frame to a file
}

Я не могу найти такую ​​структуру данных в R. Может ли кто-нибудь указать мне на любой код, который иллюстрирует те же функции?

Ответ 1

Просто поместите data.frames в список. Плюсом является то, что list отлично работает с циклами стиля apply. Например, если вы хотите сохранить файл data.frame, вы можете использовать mapply:

l = list(df1, df2)
mapply(write.table, x = l, file = c("df1.txt", "df2.txt"))

Если вам нравятся стили стиля apply (и вы будете доверять мне:)), пожалуйста, посмотрите на пакет epic plyr. Это может быть не самый быстрый пакет (смотрите data.table для быстрого), но он капает с синтаксическим сахаром.

Ответ 2

Списки могут использоваться для хранения почти всех, включая data.frame s:

## Versatility of lists
l <- list(file(), new.env(), data.frame(a=1:4))

Для записи нескольких объектов данных, хранящихся в списке, lapply() является вашим другом:

ll <- list(df1=df1, df2=df2)
## Write out as *.csv files
lapply(names(ll), function(X) write.csv(ll[[X]], file=paste0(X, ".csv")))
## Save in *.Rdata files
lapply(names(ll), function(X) {
    assign(X, ll[[X]]) 
    save(list=X, file=paste0(X, ".Rdata"))
})

Ответ 3

То, что вы ищете, это list. Вы можете использовать такую ​​функцию, как lapply, чтобы обрабатывать каждый из ваших кадров данных таким же образом. Однако могут быть случаи, когда вам необходимо передать свой список фреймов данных функции, которая обрабатывает кадры данных по отношению друг к другу. В этом случае lapply вам не поможет.

Вот почему важно отметить, как вы можете получить доступ и перебрать кадры данных в свой список. Это было сделано так:

mylist[[data frame]][row,column]

Обратите внимание на двойные скобки вокруг вашего индекса фрейма данных. Поэтому для вашего примера это будет

df1 <- data.frame(c(1,2,3), c(4,5,6))
df2 <- data.frame(c(11,22,33), c(44,55,66))
mylist<-list(df1,df2)

mylist[[1]][1,2] вернет 4, тогда как mylist[1][1,2] вернет NULL. Мне потребовалось время, чтобы найти это, поэтому я подумал, что это может быть полезно для публикации здесь.