【问题标题】:Loop too fast for read.csvread.csv 循环太快
【发布时间】:2017-04-21 02:41:09
【问题描述】:

我写了一个循环来读取 csv 文件并 rbind。

vec1 = c(0,1,3,5,9)
vec2 = c("mom", "dad")
c = data.frame()

for(i in length(vec1))
{
  for (j in length(vec2))
  {
    dir = paste("../data/year ", vec1[i], "/ff_", vec2[j], "_cb", vec1[i], ".csv", sep="")
    a = read.csv(dir)
    Sys.sleep(3)
    c = rbind(c,a)

  }

}

但是,当我尝试执行它时,只有最后一次迭代的结果存在。 (即a 具有上次迭代的值,ca 相同)。

虽然这是因为循环太快了,所以它不会等待 read.csv 完成,然后再转到下一个。因此,我在那里放了一个 sys.sleep(3) 。

但是,同样的问题仍然存在。而且,我可以手动设置ij来完成这个任务,所以语法应该是正确的,但我不知道是什么问题。

谢谢!

【问题讨论】:

    标签: r for-loop read.csv


    【解决方案1】:

    您的循环不正确。 for(i in length(vec1)) 只会执行一次迭代。正确的格式是:for(i in 1:length(vec1)) 例如试试这个:

    vec1 = c(0,1,3,5,9)
    vec2 = c("mom", "dad")
    for(i in 1:length(vec1))
    {
      for (j in 1:length(vec2))
      {
        print(paste(i, j))   
      }  
    }
    

    然后用你的陈述重复这个例子。

    【讨论】:

    • 这是一个令人尴尬的错误。谢谢。
    【解决方案2】:

    正如Dave2e 在他们的回答中指出的那样,您的循环不正确。虽然他们的答案是正确的,但如果vec1vec2 是零长度向量,最好使用seq_along 来避免出现问题。例如:

    vec1 <- integer()
    vec2 <- c("mom", "dad")
    
    for(i in 1:length(vec1))
    {
      for (j in 1:length(vec2))
      {
        print(paste(vec1[i], vec2[j]))
      }
    }
    #[1] "NA mom"
    #[1] "NA dad"
    #[1] " mom"
    #[1] " dad"
    

    当你真的不想迭代时:

    for(i in seq_along(vec1))
    {
      for (j in seq_along(vec2))
      {
        print(paste(vec1[i], vec2[j]))
      }
    }
    

    在这种特定情况下,您甚至不需要整数迭代器。您可以简单地循环遍历矢量元素本身。

    vec1 <- c(0, 1)
    vec2 <- c("mom", "dad")
    
    for(v1 in vec1)
    {
      for (v2 in vec2)
      {
        print(paste(v1, v2))
      }
    }
    # [1] "0 mom"
    # [1] "0 dad"
    # [1] "1 mom"
    # [1] "1 dad"
    

    【讨论】:

    • 感谢您的详细解释和提示。但我只能接受一个答案>.>。对此感到抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2023-03-24
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多