对于read.csv循环太快

时间:2017-04-21 02:41:09

标签: r for-loop read.csv

我写了一个循环来读取csv文件并对它们进行重新绑定。

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来完成此任务,因此语法应该是正确的,但我不知道问题是什么。

谢谢!

2 个答案:

答案 0 :(得分:7)

你的循环不正确。 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))   
  }  
}

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

答案 1 :(得分:4)

在答案中注明Dave2e,你的循环不正确。虽然他们的回答是正确的,但如果seq_alongvec1是零长度向量,最好使用vec2来避免问题。例如:

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"