Использование цикла for в функции, возвращает только последнее значение - PullRequest
0 голосов
/ 01 сентября 2018

Я пишу функцию, которая берет каталог данных и считывает их, и (если он достигает порога завершенных случаев) вычисляет корреляцию между двумя переменными в данных («сульфат» и «нитрат») , Я хочу, чтобы это выполнялось в цикле for для создания числового вектора значений корреляции (одно значение для каждого файла в каталоге).

Однако, когда я запускаю код, он возвращает только последнее значение.

Я довольно новичок в R (поэтому я могу делать простые ошибки, и у меня установлена ​​новейшая версия R). Ниже приведен код:

corr <- function(directory, threshold = 0) {
  filenames3 <- list.files(directory, pattern = ".csv", full.names = TRUE)
  loop_length <- length(filenames3)
  correlation_values <- numeric()

  for(i in loop_length) {

    read_in_data3 <- read.csv(filenames3[i])
    complete_boolean <- complete.cases(read_in_data3)
    nobs2 <- sum(complete_boolean) 
    data_rmNA <- read_in_data3[complete_boolean, ] 

    if(nobs2 > threshold) {
    correlation_values <- c(correlation_values,
                        cor(data_rmNA[["sulfate"]],
                            data_rmNA[["nitrate"]]))
    }
  }
  correlation_values
}

corr("C:/Users/Danie/OneDrive/Documents/R/specdata")

Я попытался указать длину вектора, например, correlation_values <- numeric(length = loop_length). Это возвращает вектор правильной длины, но все значения равны 0, за исключением последнего, который работает правильно. Я рассматривал похожие вопросы, но все еще не могу найти решение своей проблемы.

Я предполагаю, что где-то теряю информацию в цикле (перезаписывая переменную или что-то в этом роде).

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 01 сентября 2018

Я думаю, вам нужно сказать for(i in 1:loop_length) вместо for(i in loop_length).

R будет перебирать каждый элемент в указанном векторе, но сейчас ваш вектор имеет длину 1, поэтому возвращается только последнее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...