Cómo corregir en R: el argumento no es numérico ni lógico: devuelve na

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:

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:

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:

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:

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:

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:

Producción

Esta vez, el programa se compiló con éxito sin ningún mensaje de advertencia. 

Publicación traducida automáticamente

Artículo escrito por bhuwanesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *