在循环内使用循环进行编号

时间:2015-03-02 18:19:34

标签: r

我正在尝试生成几行文本,其中数字在文本末尾按顺序变化。我正在使用“paste()”来编写文本并尝试使用“for循环”来顺序更改文本末尾的数字。现在,我想写几百行,所以我创建一个列表并尝试填充列表。举个例子,我想写一下:

  $DATA ESTIM1101001.csv
  $DATA ESTIM1101002.csv
  .
  .
  .
  $DATA ESTIM11010020.csv

  $DATA ESTIM1102001.csv
  $DATA ESTIM1102002.csv
  $DATA ESTIM1102003.csv
  .
  .
  .
  $DATA ESTIM11020020.csv


  $DATA ESTIM11030001.csv
  $DATA ESTIM11030002.csv
  .
  .
  . 
  $DATA ESTIM110300020.csv      

详细说明,在ESTIM110i00j.csv中i = 1到30且j = 1到20
所以30 * 20 =总共600行。

我试图通过以下代码执行此操作:

b <- list()
for (i in 1:30) {
 for(j in 1:20) {
   for(p in 1:600){
b[[p]]<-(paste("$DATA",paste("ESTIM110",i,"00",j,".csv",sep=""),sep=" "))}}}

然而,对于所有600行,我最终得到$ DATA ESTIM1010300020.csv。我怀疑是我没有正确编写for循环来改变数字。非常感谢您帮助我们清楚地理解for循环以实现此任务。谢谢。

2 个答案:

答案 0 :(得分:5)

这是一种矢量化方法,使用expand.grid查找数字序列的所有组合,并sprintf格式化最终字符串:

ids <- expand.grid(1:30, 1:20)
sprintf("$DATA ESTIM110%0d00%0d.csv", ids[,1], ids[,2])

示例输出:

    > head(sprintf("$DATA ESTIM110%0d00%0d.csv", ids[,1], ids[,2]))
[1] "$DATA ESTIM1101001.csv" "$DATA ESTIM1102001.csv" "$DATA ESTIM1103001.csv" "$DATA ESTIM1104001.csv"
[5] "$DATA ESTIM1105001.csv" "$DATA ESTIM1106001.csv"

答案 1 :(得分:4)

你的逻辑有点偏。它会在pi递增之前循环遍历j循环600次。解决这个问题的一种方法是添加一个计数器,比如

b <- list()
count <- 1
for (i in 1:30) {
    for(j in 1:20) {
        b[[count]]<-(paste("$DATA",paste("ESTIM110",i,"00",j,".csv",sep=""),
            sep=" "))
        count <- count + 1
    }
}