user3728428
user3728428

Reputation: 69

warning message in mean.default argument is not numeric or logical returning na but my vector is numeric

i am running this R code to import a lot of csv file and calculate one mean of a numerico vector (nitrate) for all the datasets filtering by some values of an integer vector, ID.

setwd("C:/Users/americo/Documents/Documenti_2_0/Education/Data science/Coursera/R programming/rworkingdir/specdata")
lista_tot1 = list.files(pattern="*.csv");
lista_tot2 = lapply(lista_tot1, read.csv, sep = ",")#stampa tutti i csv                                  
lista_tot3<-do.call("rbind", lista_tot2)
lista_tot<-lista_tot3[is.element(lista_tot3$ID, 3:4),]
media<-mean(lista_tot$nitrate, na.rm=TRUE)
media

and it works.

But if i try to write this function, which seems similar to me:

pollutantmean <- function(directory, pollutant, id = 1:332) {
  setwd(directory)
  lista_tot1 = list.files(pattern="*.csv");
  lista_tot2 = lapply(lista_tot1, read.csv, sep = ",")  
  lista_tot3<-do.call("rbind", lista_tot2)
  lista_tot<-lista_tot3[is.element(lista_tot3$ID, id),]
  media<-mean(lista_tot$pollutant), na.rm=TRUE)
  return(media)
}

and then

media1<-pollutantmean("C:/Users/americo/Documents/Documenti_2_0/Education/Data science/Coursera/R programming/rworkingdir/specdata","nitrate", 3:4)

it then returns to me the message:

warning message in mean.default argument is not numeric or logical returning na 

...but my vector is numeric

that really doesn't make sense to me. if i ask to return of the structure of the last dataset, lista_tot, nitrate is still numeric.

I really don't know what to do, if some very experienced user could help me i would be extremely grateful.

Upvotes: 6

Views: 21219

Answers (1)

IRTFM
IRTFM

Reputation: 263332

Change this:

media<-mean(lista_tot$pollutant), na.rm=TRUE)

to this:

media<-mean(lista_tot[[pollutant]], na.rm=TRUE)

because the "$" does not evaluate it's argument. In this case "pollutant" is not a column name so you need an extraction function that will evaluate what the named object, pollutant, is "carrying" (namely the column name, "nitrate")to get the proper extraction from the dataframe.

Upvotes: 11

Related Questions