corr <- function(directory, threshold = 0) {
files_full<-list.files(directory, full.names=TRUE)
v<-vector()
for (i in 1:10) {
a <- (read.csv(files_full[i]))
b <- subset(a, (!is.na(a[,2])) & (!is.na(a[,3])))
c <- length(b[ ,4])
if (c > threshold) {
d <- cor(b[ ,2],b[ ,3])
} else {
d <- vector(mode="numeric", length = 0)
}
v <- rbind(v, d)
}
v
}
cr <- corr("specdata", 0)
我在目录中有一组.csv文件,并希望将它们作为参数传递给上面的函数。对于每个文件,我想选择完整个案的数量,并且,如果该数量大于通过第二个函数参数设置的阈值,我想生成文件的两列中保存的值之间的相关性(cols 2和3)。最终目标是包含满足阈值条件的每个文件的相关值的向量。如果不满足阈值条件,我想返回长度为0的数字向量。
第一个文件中的完整个案数为117.只要阈值低于此数,上述函数就可以正常工作。如果我将阈值设置为&gt; = 117,则函数返回长度为0的向量。我收到警告
In rbind(v, d) :
number of columns of result is not a multiple of vector length (arg 2)
似乎if语句中的条件卡在第一个文件中完整个案数的值上,而不是循环遍历。
如果有人能解释我出错的地方,我将非常感激!
答案 0 :(得分:2)
rbind
用于绑定向量或矩阵的行。如果阈值> = 117,则d
是长度为零的向量。行绑定两个长度为零的向量给出2行和0列的矩阵(参见例如dim(rbind(vector(), vector()))
)。将该零列矩阵与非零长度矢量组合是棘手的。这就是警告所说的。
实现目标的更好方法是应用计算每个文件的相关性的函数。您可以使用NA
而不是返回零长度矢量。
correlation_of_large_file <- function(file, threshold = 0) {
df <- read.csv(file)
if (nrow(df) > threshold)
cor(df[, 2], df[, 3])
else
NA
}
files_full <- list.files("specdata", full.names = TRUE)
vapply(files_full, correlation_of_large_file, numeric(1), threshold = 117)