Сохранение и загрузка данных.

Я создал фреймворк на основе набора твиттеров в следующем виде:

 rdmTweets <- userTimeline("rdatamining", n=200)
 df <- do.call("rbind", lapply(rdmTweets, as.data.frame))

Теперь я сохраняю фрейм данных с сохранением таким образом:

 save(df, file="data")

Как я могу загрузить этот сохраненный фрейм данных для будущего использования? Когда я использую:

  df2 <- load("data")

и я применяю dim(df2) он должен возвращать количество твитов, которые имеет фрейм данных, но он показывает только 1.

Ответ 1

Как отмечает @mrdwab, save сохраняет имена, а также данные/структуру (и на самом деле может сохранить несколько разных объектов R в одном файле). Существует еще одна пара функций хранения, которые ведут себя больше, как вы ожидаете. Попробуй это:

saveRDS(df, file="mytweets.rds")
df2 <- readRDS("mytweets.rds")

Эти функции могут обрабатывать только один объект за раз.

Ответ 2

save сохраняет имя набора данных, а также данные. Таким образом, вы не должны назначать имя для load("data") и вы должны быть в порядке. Другими словами, просто используйте:

load("data")

и он загрузит объект с именем df (или все, что содержится в файле "данные") в текущее рабочее пространство.

Я бы предложил более оригинальное имя для вашего файла, и подумайте над добавлением расширения, которое поможет вам запомнить, что такое ваши файлы сценариев, ваши файлы данных и т.д.


Пройдите свой простой пример:

rm(list = ls())              # Remove everything from your current workspace
ls()                         # Anything there? Nope.
# character(0)
a <- 1:10                    # Create an object "a"
save(a, file="myData.Rdata") # Save object "a"
ls()                         # Anything there? Yep.
# [1] "a"
rm(a)                        # Remove "a" from your workspace
ls()                         # Anything there? Nope.
# character(0)
load("myData.Rdata")         # Load your "myData.Rdata" file
ls()                         # Anything there? Yep. Object "a".
# [1] "a"
str(a)                       # Is "a" what we expect it to be? Yep.
#  int [1:10] 1 2 3 4 5 6 7 8 9 10
a2 <- load("myData.Rdata")   # What about your approach?
ls()                         # Now we have 2 objects
# [1] "a"  "a2"
str(a2)                      # "a2" stores the object names from your data file.
#  chr "a"

Как вы можете видеть, save позволяет сохранять и загружать сразу несколько объектов, что может быть удобно при работе над проектами с несколькими наборами данных, которые вы хотите сохранить вместе.

С другой стороны, saveRDS (из принятого ответа) позволяет сохранять только отдельные объекты. В некотором смысле это более "прозрачно", так как load() не позволяет просматривать содержимое файла без его первой загрузки.

Ответ 3

Другим вариантом является сохранение вашего фрейма данных в виде файла csv. Преимущество этого варианта заключается в том, что он обеспечивает долгосрочное хранение, то есть вы, вероятно, сможете открыть свой CSV файл на любой платформе через десять лет. С RData файлом вы можете открыть его только с помощью R, и я бы не хотел делать ставки, открывая его между версиями.

Чтобы сохранить файл как csv, просто используйте: read.csv и write.csv, поэтому:

write.csv(df, file="out.csv", row.name=FALSE)
df = read.csv("out.csv", header=TRUE)

Комментарий Гэвина ниже поднял пару пунктов:

Маршрут CSV работает только для табличных данных.

Совершенно правильно. Но если вы сохраняете фрейм данных (как OP), ваши данные в табличной форме.

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

Чтобы играть в devil adovacate, вы можете использовать этот аргумент в Excel и сохранить свои данные как xls. Однако сохранение ваших данных в формате csv означает, что нам не нужно беспокоиться об этом.

Формат файла R документирован, чтобы можно было легко прочитать двоичные данные в другой системе, используя эту открытую информацию.

Я полностью согласен - хотя "легко" немного силен. Вот почему сохранение в качестве файла RData не так уж и важно. Но если вы сохраняете табличные данные, почему бы не использовать файл csv?

Для записи есть некоторые причины для сохранения табличных данных в качестве файла RData. Например, скорость чтения/записи файла или размера файла.