Build R Функция, которая принимает каталог, в котором хранятся файлы, и пороговое значение.И возвращает корреляцию - PullRequest
0 голосов
/ 24 октября 2018

Дано: список файлов с показаниями датчика для сульфата и нитрата.Файл содержит 4 столбца (Date, Sulfate, Nitrate, ID).ID относится к имени файла.который назван в честь местоположения зонда.то есть местоположение зонда 11 имеет файл с именем 011.csv и 11, заполняющий столбец идентификатора.Есть 332 файла.
Строки имеют несколько значений NA.Требуется функция для вывода корреляции между Nitrate и Sulfate полных случаев для каждого зонда, где полные случаи превышают заданный порог (случаи, в которых не найдено NA s).
Функция принимает каталог(где находятся файлы) и пороговое значение (количество завершенных дел). Пример:

cr <- corr("specdata", 400)
head(cr)

будет выводить (один вывод на пробу)

# [1] -0.01895754 -0.04389737 -0.06815956 -0.07588814  0.76312884 -0.15782860
summary(cr)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -0.17623 -0.03109  0.10021  0.13969  0.26849  0.76313

Example2:

cr <- corr("specdata", 5000)
summary(cr)

будет выводить (потому что ни у одного датчика нет более 5000 полных выборок

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 

У меня есть следующий код, который вычисляет корреляцию для всех датчиков, но я не знаю, как кодировать впорог и получить его в векторе, который выводит индивидуальную корреляцию для каждого местоположения зонда.

corr <- function(directory, thresh)  {
     setwd(directory)
     filevector3 <- list.files()
     megadata <- do.call('rbind', lapply(filevector3[1:332], read.csv, header = T))
     cormega <- cor(megadata$sulfate, megadata$nitrate, use = "complete.obs")
     nobs <- c(sum(complete.cases(megadata)))

     return(cormega)
}  

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

В итоге я понял это.Вот.может быть, есть лучший способ без двух циклов, но я новичок в этом.

   for(i in 1:332) {
          compdata <- read.csv(filevector2[i])
          nobs <- c(nobs, sum(complete.cases(compdata)))
     }

     nobs  # here I returned the nobs, just to make sure that part was working right

     ## loop below populates corrvect vector with all the correlation coeff for each probe that meets threshold 
     ## requirements indicated in the if statement.
     for(j in 1:332) {
          minicomp <- read.csv(filevector2[j])
          if (nobs [j] > thresh) {
               corrvect <- c(corrvect, cor(minicomp$sulfate, minicomp$nitrate, use = "complete.obs"))

      }

 } 

 corrvect # here I returned the corrvect

}

0 голосов
/ 24 октября 2018

Может быть, следующая функция делает то, что вы хотите.
Трудно сказать, если она делает, потому что нет данных для проверки функции.

corr <- function(directory, thresh)  {
  f <- function(filename, thresh){
    dat <- read.csv(filename)
    inx <- complete.cases(dat)
    val <- if(sum(inx) >= thresh)
      with(dat[inx, ], cor(sulfate, nitrate))
    else
      NA
    c(value = val, id = dat$ID[1])
  }

  old_dir <- setwd(directory)
  on.exit(setwd(old_dir))

  files <- list.files(pattern = "\\.csv", ignore.case = TRUE)
  res <- lapply(files, f, thresh = thresh)
  do.call(rbind, res)
}
...