如何在R中使用for循环保存具有不同名称的文件?
我有168个文件保存在一个列表中,我正试图使用for循环将它们保存到我的文件夹中。如何在R中使用for循环保存具有不同名称的文件?,r,loops,R,Loops,我有168个文件保存在一个列表中,我正试图使用for循环将它们保存到我的文件夹中。 我需要按照下面提供的方式命名文件,但我的代码现在所做的是用不同的名称保存168个文件,但它会将同一个文件保存168次,而不是循环使用单独的名称保存列表中的每个文件。 有办法吗 strings_label = c('a', 'approxequal', 'b', 'c', 'd', 'e', 'equal', 'f', 'five', 'four', 'g', 'greater'
我需要按照下面提供的方式命名文件,但我的代码现在所做的是用不同的名称保存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)
}
}
}
任何帮助都将不胜感激。当前代码将循环遍历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
}
}
p让我建议一些风格改进。这些不仅可以帮助您编写更好的代码,而且还可以帮助您首先编写代码,因为每个问题都将被分解成更小的、易于解决的问题
请注意,其中一些可能是很少的高级解决方案
首先,定义将生成文件名的函数:
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
}
获取两个元素的所有组合,请考虑<代码>扩展.GET。这可以与
mapply
一起使用来命名:
combinations = expand.grid("label"=string_label, "number"=string_number)
filenames = mapply(make_filename, combinations$label, combinations$number)
使用另一个mappy
或如果您使用另一个函数,所有操作都可以在一个mappy
调用中完成:
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$letters
和res$numbers
相比可读性较差
第二个魔法是mapply
,它只是Map
函数的一个不同名称,您可能从不同的编程语言(例如Python
)中知道它
虽然看起来很恐怖,mapply
非常简单。它只使用输入的第一个元素调用函数,然后是第二个元素,依此类推。基本上是:
for(i in 1:n)
fun(input1[i], input2[i], ..., inputk[i])
只是稍微聪明一点。尽管缺少{
第一个循环。你可以试着打印出文件.path
参数部分,只是为了验证它是否是你想要的吗?就是这样,非常感谢你,我不敢相信我没有看到!有趣的东西,我对R编码非常陌生,所以我一直在使用非常基本的技术,但我肯定会尝试你建议的东西d!非常感谢