Cómo solucionarlo: nivel de factor no válido, NA generado en R

En este artículo, veremos los enfoques con los ejemplos para corregir el error: nivel de factor no válido, NA generado.

Este tipo de mensaje de advertencia es producido por el compilador cuando un programador intenta agregar un valor a una variable de factor en R que no tiene existencia previa como un nivel definido. El mensaje de advertencia completo se muestra a continuación:

Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "C") :
  invalid factor level, NA generated 

Cuándo puede ocurrir un error

Vamos a crear un marco de datos.

R

# Create a data frame
dataframe < - data.frame(team=factor(c('Alpha', 'Alpha',
                                       'Beta', 'Beta',
                                       'Charlie', 'Charlie',
                                       'Charlie')),
                         points=c(96, 91, 86, 89, 93, 87, 91))
  
# Display the data frame
dataframe
  
# Display the structure of the data frame
str(dataframe)

Producción:

En este ejemplo, la variable de equipo tiene solo los tres tipos de valores: «Alpha», «Beta», «Charlie». Ahora, intentaremos insertar una fila adicional al final del marco de datos que tenga el nombre del equipo igual a «Gamma».

Ejemplo:

R

# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha', 
                                      'Beta', 'Beta',
                                      'Charlie', 'Charlie',
                                      'Charlie')),
                 points=c(96, 91, 86, 89, 93, 87, 91))
  
#add new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)

Producción:

Producción

El compilador produce el mensaje de advertencia. Esto se debe a que el valor «Gamma» aún no está presente en la columna del equipo. Tenga en cuenta que es solo un mensaje de advertencia y el compilador insertará automáticamente una nueva fila al final del marco de datos, pero en lugar de «Gamma», la celda tendría el valor igual a NA.

R

# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha',
                                      'Beta', 'Beta',
                                      'Charlie', 'Charlie',
                                      'Charlie')),
                 points=c(96, 91, 86, 89, 93, 87, 91))
  
# add new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)
  
# Display the dataframe
dataframe

Producción:

Cómo se puede evitar la advertencia:

Podemos deshacernos de esta advertencia transformando primero la variable de factor en una variable de carácter y luego podemos transformarla nuevamente en una variable de factor justo después de agregar la fila adicional.

Ejemplo:

R

# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha',
                                      'Beta', 'Beta', 
                                      'Charlie', 'Charlie',
                                      'Charlie')),
                 points=c(96, 91, 86, 89, 93, 87, 91))
  
# Convert team variable to character
dataframe$team <- as.character(dataframe$team)
  
# Insert a new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)
  
# Transform team variable back to factor
dataframe$team <- as.factor(dataframe$team)
  
# Display the data frame
dataframe

Producción:

Como puede ver en la salida, la advertencia, así como la cosa «NA», se han eliminado del marco de datos. Ahora mostremos la estructura del marco de datos modificado una vez:

R

# Create a data frame
dataframe <- data.frame(team=factor(c('Alpha', 'Alpha', 
                                      'Beta', 'Beta', 
                                      'Charlie', 'Charlie',
                                      'Charlie')),
                 points=c(96, 91, 86, 89, 93, 87, 91))
  
# Convert team variable to character
dataframe$team <- as.character(dataframe$team)
  
# Insert a new row to end of data frame
dataframe[nrow(dataframe) + 1,] = c('Gamma', 99)
  
# Transform team variable back to factor
dataframe$team <- as.factor(dataframe$team)
  
# Display the structure of the data frame
str(dataframe)

Producción:

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 *