【问题标题】:How to save files with different names using for loops in R?如何使用 R 中的 for 循环保存具有不同名称的文件?
【发布时间】:2021-02-22 22:16:12
【问题描述】:

我在一个列表中保存了 168 个文件,我正在尝试使用 for 循环将它们保存到我的文件夹中。
我需要按照下面提供的方式命名文件,但我的代码现在所做的是保存 168 个不同名称的文件,但它保存同一个文件 168 次,而不是循环遍历并用单独的名称保存列表中的每个文件。
有什么办法吗?

strings_label = c('a', 'approxequal', 'b', 'c', 'd', 'e', 'equal',
                  'f', 'five', 'four', 'g', 'greater', 'greaterequal',
                  'less', 'lessqual', 'notequal', 'one', 'seven',
                  'six', 'three', 'two')
strings_number = c('01', '02', '03', '04', '05', '06', '07', '08')
suffix = '40264464'

for(p in 1:length(myelement))
  for(this_label in strings_label)
  {
    for(this_number in strings_number)
    {
      
      write.csv(myelement[[p]],
                paste0("/Users/jwolo/Documents/section_images/",
                paste(this_label, this_number, suffix, sep = "_"), ".csv"),
                row.names = TRUE)
    }
  }
}

任何帮助将不胜感激。

【问题讨论】:

  • 尽管第一个循环缺少{,但您的代码看起来还不错。您可以尝试打印出 file.path 参数部分来验证它是否是您想要的吗?

标签: r loops


【解决方案1】:

当前代码循环遍历 p 的每个增量的所有文件名。从而将最后一个数据帧保存到所有文件中。
一种处理方法是在内部循环中增加 p。

p<-1
for(this_label in strings_label){
      for(this_number in strings_number)
      {
         write.csv(myelement[[p]],
                   paste0("/Users/jwolo/Documents/section_images/",
                          paste(this_label, this_number, suffix, sep = "_"), ".csv"),
                   row.names = TRUE)
         p<- p +1
      }
}

【讨论】:

  • 就是这样,非常感谢,不敢相信我没有看到!
【解决方案2】:

让我建议一些风格改进。这些不仅可以帮助您编写可以说更好的代码,而且还可以帮助您首先编写代码,因为每个问题都将被分解成更小的易于解决的问题。

请注意,其中一些可能是不太高级的解决方案。

首先,定义一个生成文件名的函数:

make_filename = function(label, number){
  # these can be easily turned into parameters
  suffix = "40264464"
  dir = "/Users/jwolo/Documents/section_images/"

  # doing this, putting it all on a single line or using pipe %>%
  # is just matter of style
  filename = paste(label, number, suffix, sep="_")
  filename = paste0(filename, ".csv")
  filename = file.path(dir, filename)

  filename
}

要获得两个元素的所有组合,请考虑expand.grid。这可以与mapply一起使用来命名:

combinations = expand.grid("label"=string_label, "number"=string_number)
filenames = mapply(make_filename, combinations$label, combinations$number)

使用另一个mapply 或者如果您创建另一个函数,所有这些都可以在一个mapply 调用中完成:

save_element = function(element, label, number){
  filename = make_filename(label, number)
  write.csv(element, filename,row.names=TRUE)
  }

combinations = expand.grid("label"=string_label, "number"=string_number)
mapply(save_element, myelement, combinations$label, combinations$number)

通过将各个步骤的逻辑包装到独立的函数中,结果代码更具可读性,更不容易出错。

说明:

所有的魔法都在两个函数中,expand.grid 将输入向量组合成data.frame

expand.grid(c("a","b"), c(1,2))
#  Var1 Var2
#1    a    1
#2    b    1
#3    a    2
#4    b    2

通过指定输入向量的名称,然后为列命名,这样我们就可以指向它们,而不是使用res[,1]res[,2],这与res$lettersres$numbers 相比可读性较差。

第二个魔法是mapply,它只是Map 函数的不同名称,您可能从不同的编程语言中知道(例如Python)。

虽然看起来很吓人,但mapply 真的很简单。它只是使用其输入的第一个元素调用函数,然后是第二个元素,依此类推。本质上是:

for(i in 1:n)
   fun(input1[i], input2[i], ..., inputk[i])

稍微聪明一点。

【讨论】:

  • 有趣的东西,我对 R 编码真的很陌生,所以我一直在使用非常基本的技术,但我一定会尝试你建议的东西!非常感谢
猜你喜欢
  • 2021-04-16
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多