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:
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: