Сохранение и загрузка данных.
Я создал фреймворк на основе набора твиттеров в следующем виде:
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. Например, скорость чтения/записи файла или размера файла.