R:为什么这个循环条件会粘住?

时间:2016-09-25 13:37:42

标签: r

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语句中的条件卡在第一个文件中完整个案数的值上,而不是循环遍历。

如果有人能解释我出错的地方,我将非常感激!

1 个答案:

答案 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)