在 R 中,嵌套循环在读取多个文件时不会 return 预期结果
In R, nested loops don't return the expected result while reading through multiple files
Objective:计算多个文件的2个变量之间的相关系数,满足完整案例的自定义标准(阈值参数)。
数据:指定目录下的332个.csv文件。
所需输出:包含文件相关系数的向量。
代码:
correl <- function(directory = "~/specdata/specdatacsv", threshold = 0) {
filelist <- list.files(path = directory, pattern = ".csv", full.names = TRUE)
nobs <- numeric()
corrvector <- numeric()
for(i in length(filelist)) {
data <- read.csv(filelist[i])
nobs <- sum(complete.cases(data))
if (nobs <= threshold) { next
} else {
nitrate <- as.vector(data$nitrate)
sulfate <- as.vector(data$sulfate)
goodSulfate <- complete.cases(sulfate)
goodNitrate <- complete.cases(nitrate)
icorr <- cor(goodNitrate, goodSulfate)
corrvector <- c(corrvector, icorr)
}
}
corrvector
}
阈值 150 的输出应该 return:
[1] -0.01895754 -0.14051254 -0.04389737 -0.06815956 -0.12350667 -0.07588814
但是空的校正向量得到 returned。请帮我找出我犯的错误。
根据@stefan 的评论,问题出在这里:
for(i in length(filelist))
所以,如果 filelist
的长度是 332,这等同于:
for(i in 332)
而你实际上想要
for(i in 1:332)
这可以通过以下任一方式轻松实现:
for (i in 1:length(filelist)) {
print(i)
}
或
for (i in seq_along(filelist)) {
print(i)
}
Objective:计算多个文件的2个变量之间的相关系数,满足完整案例的自定义标准(阈值参数)。
数据:指定目录下的332个.csv文件。
所需输出:包含文件相关系数的向量。
代码:
correl <- function(directory = "~/specdata/specdatacsv", threshold = 0) {
filelist <- list.files(path = directory, pattern = ".csv", full.names = TRUE)
nobs <- numeric()
corrvector <- numeric()
for(i in length(filelist)) {
data <- read.csv(filelist[i])
nobs <- sum(complete.cases(data))
if (nobs <= threshold) { next
} else {
nitrate <- as.vector(data$nitrate)
sulfate <- as.vector(data$sulfate)
goodSulfate <- complete.cases(sulfate)
goodNitrate <- complete.cases(nitrate)
icorr <- cor(goodNitrate, goodSulfate)
corrvector <- c(corrvector, icorr)
}
}
corrvector
}
阈值 150 的输出应该 return:
[1] -0.01895754 -0.14051254 -0.04389737 -0.06815956 -0.12350667 -0.07588814
但是空的校正向量得到 returned。请帮我找出我犯的错误。
根据@stefan 的评论,问题出在这里:
for(i in length(filelist))
所以,如果 filelist
的长度是 332,这等同于:
for(i in 332)
而你实际上想要
for(i in 1:332)
这可以通过以下任一方式轻松实现:
for (i in 1:length(filelist)) {
print(i)
}
或
for (i in seq_along(filelist)) {
print(i)
}