【问题标题】:Using for loop to write data frame as dta file in R使用for循环将数据帧写入R中的数据文件
【发布时间】:2018-11-19 17:54:39
【问题描述】:

我在列表a 中有数据框,我想使用循环将它们保存为rda 并写入dta。我不明白为什么我会收到找不到对象数据框的错误消息:

for (f in a) {
  for (name in 1:length(filenames)) {
    save(as.data.frame(f),file = paste("~/Dropbox/Data_Insert/Panels/",name,end_rda,sep=""))
    write.dta(as.data.frame(f),file = paste("~/Dropbox/Data_Insert/Panels/",name,end_dta,sep=""))
         }
}

Error in save(as.data.frame(f), file = paste("~/Dropbox/Data_Insert/Panels/",  : 
  object ‘as.data.frame(f)’ not found

那么f,这将索引列表中的数据框?我使用了as.data.frame(f),因为当我只使用f 时,我收到了消息:

The object "dataframe" must have class data.frame

我把代码改成了for f in a,但是还是返回了一个错误,说as.data.frame(f) not found。

【问题讨论】:

  • for (f in 1:length(a))循环变量f变成1、2等等。也许你想要for (f in a)
  • @RuiBarradas 我仍然收到消息:找不到对象'as.data.frame(f)'
  • 是的,在 R 中,您有两个使用 for 循环的选择。(a) 您可以循环索引并使用索引,for (f in 1:length(a)) {save(as.data.frame(a[[f]]))... 或 (b) 循环对象本身 for (f in a) {save(as.data.frame(f))...。两者各有利弊,但你必须选择一个。你上面的代码试图同时做这两个。
  • 另外,为什么这里有嵌套循环?看来您在filenames 中的每个name 下都保存了相同f 数据框的副本?
  • @Gregor 是的,我有与列表中每个数据帧匹配的文件名

标签: r for-loop dta


【解决方案1】:

我认为这就是你想要做的。我假设a 是一个数据帧列表,filenames 是一个相同长度的字符向量。

for (i in 1:length(a)) {
  to_save = as.data.frame(a[[i]])
  save(to_save, file = paste0("~/Dropbox/Data_Insert/Panels/", filenames[i], end_rda))
  write.dta(to_save, file = paste0("~/Dropbox/Data_Insert/Panels/", filenames[i], end_dta))
}

请注意,save 保留了 R 对象的名称,因此当您 load 任何这些文件时,它将以名称 to_save 加载到工作区中。这似乎很糟糕。对于单个 R 对象,我强烈建议您使用 saveRDS 并创建 .RDS 文件而不是 save。有关 Rda 与 RDS 的示例,请参见 Ricardo's answer to this question

【讨论】:

  • 谢谢,我对循环范围的语法有点困惑
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2021-11-14
  • 2020-03-29
  • 1970-01-01
  • 2021-09-03
  • 2021-01-03
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多