Хранение нескольких кадров данных в одной структуре данных - 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. Мне потребовалось время, чтобы найти это, поэтому я подумал, что это может быть полезно для публикации здесь.