2017-04-21 25 views
2

我写了一个循环,读取csv文件并对它们进行rbind。循环速度太快,无法读取。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)放在那里。

但是,同样的问题仍然存在。此外,我能够手动设置i,j来完成此任务,因此语法应该是正确的,但我不知道问题是什么。

谢谢!

回答

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)) 
    } 
} 

然后用您的语句重复的例子。

+0

这是一个令人尴尬的错误。谢谢。 – Waht

4

由于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" 
+0

感谢您的详细解释和提示。但我只能接受一个答案>。>。对于那个很抱歉。 – Waht