Перебор имен фреймов данных в R и сохранение соответствующего фрейма данных в виде файла Rds

У меня есть около 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.

отредактируйте свои сохранения saveRDS(get(mydfs[i]), file=savefile), поскольку mydfs просто имеет имя вашего фрейма данных, вам нужно «получить данные»

infominer 28.05.2019 20:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 299
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время вы просто сохраняете имена фреймов данных. Вы можете использовать функцию 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 не позволит мне принять.).

StatsStudent 28.05.2019 20:13

Другие вопросы по теме