Учебник по программированию на R> Как подмножество для каждого столбца при вычислении среднего значения? - PullRequest
0 голосов
/ 06 апреля 2020

Я изучаю R atm, одним из упражнений является создание программы для чтения среднего значения для столбца «сульфат» или столбца «нитрат». Тем не менее, я смогу получить правильное среднее значение только для одного из столбцов, а не для всех. Не могли бы вы дать мне некоторую помощь о том, как поднабор для каждого столбца при вычислении среднего значения?

Следуя шагам, которые я предпринял для объединения упражнения 1. Создайте список файлов # Объедините все файлы в одни данные Рамка. 2. создать пустой фрейм данных 3. перебрать файлы, затем связать их вместе 4. установить под фрейм данных 5. вычислить среднее для столбца (ов)

pollutantmean <- function(directory,pollutant,id=1:132){
  files_list <- list.files(directory, full.names=TRUE)   #creates a list of files
  dat <- data.frame()                                   #creates an empty data frame
  for (i in 1:132) {                                
    #loops through the files, rbinding them together 
    dat <- rbind(dat, read.csv(files_list[i]))
  }
  dat_subset <- dat[which(dat$ID %in% id),names(dat) %in% c("sulfate","nitrate")]
  mean(dat_subset[, "sulfate"], na.rm=TRUE)      #identifies the mean  while stripping out the NAs for "sulfate"
  mean(dat_subset[, "nitrate"], na.rm=TRUE)      #identifies the mean  while stripping out the NAs for "nitrate"
}

Ожидаемый результат:

pollutantmean("specdata", "sulfate", 1:10) ## [1] 4.064128 
pollutantmean("specdata", "nitrate", 70:72) ## [1] 1.706047 
pollutantmean("specdata", "nitrate", 23) ## [1] 1.280833 

Фактический вывод:

enter image description here

Я также пытался исправить это, комбинируя два столбцы в один, он будет возвращать NaN вместо ...

mean(dat_subset[,c("sulfate","nitrate")], na.rm=TRUE)

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Вы можете найти очень краткое решение, основанное на data.table. Вы можете выполнять операции над несколькими столбцами одновременно

library(data.table)

pollutantmean <- function(directory,pollutant,id=1:132){
   files_list <- list.files(directory, full.names=TRUE)   #creates a list of files
   dat <- lapply(files_list, fread)
   dat <- rbindlist(dat, use.names = TRUE, fill = TRUE)

   output <- dat[get('ID') %in% id),lapply(.SD,mean,na.rm=TRUE)]
   return(output)
}

pollutantmean(directory, c("nitrate","sulfate"), 1:10)
pollutantmean(directory, "nitrate", 1:10)
0 голосов
/ 06 апреля 2020

Если вы ищете подмножество «строк» ​​на основе входного «идентификатора», вы можете сделать следующее после создания своего фрейма данных, как предложил Linog

pollutantmean <- function(directory=NULL,pollutant,id=1:132){
  #create a list of files

  dat_subset <- dat[id,]
  print(mean(dat_subset[, pollutant], na.rm=TRUE)  )    
}
0 голосов
/ 06 апреля 2020

Мы можем прочитать файлы, упомянутые в id, и скомбинировать их, подставить под столбцы, упомянутые в pollutant, и взять среднее значение. Используя базу R, мы можем сделать:

pollutantmean <- function(directory,pollutant,id=1:132){

   files_list <- list.files(directory, full.names=TRUE)   
   dat <- do.call(rbind, lapply(files_list[id], read.csv))
   #For one column
   mean(dat[[pollutant]], na.rm = TRUE)
   #For multiple columns
   #colMeans(dat[pollutant], na.rm = TRUE)

}

pollutantmean("specdata", "sulfate", 1:10)
...