En este artículo, vamos a ver cómo corregir en R el argumento no es numérico o lógico devolviendo na.
Este es el mensaje de advertencia que puede encontrar en R. Toma la siguiente forma:
Mensaje de advertencia:
En mean.default (marco de datos): el argumento no es numérico ni lógico: devuelve NA
El compilador de R produce este tipo de error cuando intentamos calcular la media de un objeto en R pero el objeto contiene valores no numéricos o ilógicos. Este artículo se centra en cómo podemos corregir este error.
Cuándo puede ocurrir este error
Primero creemos un marco de datos:
R
# Create a data frame dataframe <- data.frame(students=c('Bhuwanesh', 'Anil', 'Suraj', 'Piyush', 'Dheeraj'), section=c('A', 'A', 'C', 'C', 'B'), minor=c(87, 98, 71, 89, 82), major=c(80, 88, 84, 74, 70)) # Print the dataframe print(dataframe)
Producción:
Ahora intentaremos calcular la media de los valores en la columna de la sección.
Ejemplo:
R
# Create a data frame dataframe <- data.frame(students=c('Bhuwanesh', 'Anil', 'Suraj', 'Piyush', 'Dheeraj'), section=c('A', 'A', 'C', 'C', 'B'), minor=c(87, 98, 71, 89, 82), major=c(80, 88, 84, 74, 70)) # Try to calculate mean of values in # section column mean(dataframe$team)
Producción:
Como puede ver en la salida, el compilador de R produce «el argumento no es numérico ni lógico: devuelve NA» ya que la sección tiene valores no numéricos.
Calculemos ahora la media del marco de datos:
Ejemplo:
R
# Create a data frame dataframe <- data.frame(students=c('Bhuwanesh', 'Anil', 'Suraj', 'Piyush', 'Dheeraj'), section=c('A', 'A', 'C', 'C', 'B'), minor=c(87, 98, 71, 89, 82), major=c(80, 88, 84, 74, 70)) # Try to calculate mean of values # of the dataframe mean(dataframe)
Producción:
¿Cómo evitar esta advertencia?
La única forma de evitar esta advertencia es usar la función mean() con vectores que solo tienen valores numéricos. Por ejemplo, en el ejemplo anterior, podemos calcular la media de la columna menor, ya que solo contiene valores numéricos:
R
# Create a data frame dataframe <- data.frame(students=c('Bhuwanesh', 'Anil', 'Suraj', 'Piyush', 'Dheeraj'), section=c('A', 'A', 'C', 'C', 'B'), minor=c(87, 98, 71, 89, 82), major=c(80, 88, 84, 74, 70)) # Try to calculate mean of values stored # at the column minor in the dataframe mean(dataframe$minor)
Producción:
Significa usar la función sapply()
R proporciona la función sapply() para calcular la media de los valores en cada columna del marco de datos.
R
# Create a data frame dataframe <- data.frame(students=c('Bhuwanesh', 'Anil', 'Suraj', 'Piyush', 'Dheeraj'), section=c('A', 'A', 'C', 'C', 'B'), minor=c(87, 98, 71, 89, 82), major=c(80, 88, 84, 74, 70)) # Try to calculate mean of values stored # at the column minor in the dataframe sapply(df, mean, 2)
Producción:
Como puede ver en la salida, el compilador R genera el mensaje de advertencia, pero también calcula los valores medios de las columnas que contienen valores numéricos. Podemos evitar la advertencia por completo especificando explícitamente las columnas que tienen valores numéricos.
R
# Create a data frame dataframe <- data.frame(students=c('Bhuwanesh', 'Anil', 'Suraj', 'Piyush', 'Dheeraj'), section=c('A', 'A', 'C', 'C', 'B'), minor=c(87, 98, 71, 89, 82), major=c(80, 88, 84, 74, 70)) # Try to calculate mean of values stored # at the column minor in the dataframe sapply(dataframe[c('minor', 'major')], mean, 2)
Producción:
Esta vez, el programa se compiló con éxito sin ningún mensaje de advertencia.