read.csv 循环太快
Loop too fast for 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
具有上次迭代的值,并且 c
与 a
相同)。
虽然这是因为循环太快了,但它不会等待 read.csv 完成才转到下一个。因此,我在那里放了一个 sys.sleep(3) 。
但是,同样的问题仍然存在。而且,我能够手动设置i
、j
来完成这个任务,所以语法应该是正确的,但我不知道问题是什么。
谢谢!
你的循环不正确。 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))
}
}
然后用你的陈述重复这个例子。
正如 在他们的回答中指出的那样,您的循环不正确。虽然他们的答案是正确的,但如果 vec1
或 vec2
是零长度向量,最好使用 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"
我写了一个循环来读取 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
具有上次迭代的值,并且 c
与 a
相同)。
虽然这是因为循环太快了,但它不会等待 read.csv 完成才转到下一个。因此,我在那里放了一个 sys.sleep(3) 。
但是,同样的问题仍然存在。而且,我能够手动设置i
、j
来完成这个任务,所以语法应该是正确的,但我不知道问题是什么。
谢谢!
你的循环不正确。 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))
}
}
然后用你的陈述重复这个例子。
正如 vec1
或 vec2
是零长度向量,最好使用 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"