У меня есть около 30 отдельных фреймов данных, загруженных в мой сеанс R, каждый с разными именами. У меня также есть вектор символов с именем mydfs
, который содержит имена всех тех фреймов данных, загруженных в мой сеанс R. Я пытаюсь перебрать mydfs и сохранить в виде файла rds каждый фрейм данных, указанный в элементах mydfs
, но по какой-то причине я могу сохранить только строку символов имени кадра данных, который я пытаюсь save (а не сам datafame). Вот смоделированный, воспроизводимый пример того, что у меня есть:
#Create vector of dataframes that exist in base r to create a reproducible example
mydfs<-c("cars","iris","iris3","mtcars")
#My code that creates files, but they don't contain my dataframe data for some reason
for (i in 1:length(mydfs)){
savefile<-paste0(paste0("D:/Data/", mydfs[i]), ".Rds")
saveRDS(mydfs[i], file=savefile)
print(paste("Dataframe Saved:", mydfs[i]))
}
Это приводит к следующему выводу журнала:
[1] "Dataframe Saved: cars"
[1] "Dataframe Saved: iris"
[1] "Dataframe Saved: iris3"
[1] "Dataframe Saved: mtcars"
Затем я пытаюсь прочитать любой из созданных мной файлов:
#But when read back in only contain a single character string of the dataframe name
a<-readRDS("D:/Data/iris3.Rds")
str(a)
chr "iris3"
Обратите внимание, что когда я читаю iris3.Rds обратно в новый сеанс R с помощью readRDS, у меня нет фрейма данных, как я ожидал, а есть один символьный вектор, содержащий имя файла данных, а не данные.
Я некоторое время не программировал на R, так как мой текущий клиент предпочитал SAS, поэтому я думаю, что каким-то образом цикл макропеременных в SAS путают с R, и поэтому, когда я вызываю saveRDS, я передаю один символ вектор вместо фактического кадра данных. Как я могу передать фрейм данных в saveRDS вместо персонажа?
Спасибо, что помогли мне распутать мое мышление SAS с моим несколько ржавым мышлением R.
В настоящее время вы просто сохраняете имена фреймов данных. Вы можете использовать функцию get
следующим образом:
mydfs<-c("cars","iris","iris3","mtcars")
for (i in 1:length(mydfs)){
savefile<-paste0(paste0("D:/Data/", mydfs[i]), ".Rds")
saveRDS(get(mydfs[i]), file=savefile)
print(paste("Dataframe Saved:", mydfs[i]))
}
readRDS('D:/Data/iris3.RDS')
Ты мой герой. Вот и все. Совсем забыл про get()
. Спасибо большое! Я приму через 8 минут (до тех пор SO не позволит мне принять.).
отредактируйте свои сохранения
saveRDS(get(mydfs[i]), file=savefile)
, поскольку mydfs просто имеет имя вашего фрейма данных, вам нужно «получить данные»