poligono para pairs librerias grafico graficas graficar grafica etiqueta ejemplos datos cuadricula r dataframe categorical-data

para - Agregue un nivel extra a los factores en el marco de datos



poligono en r (6)

Tengo un marco de datos con columnas de factor numérico y ordenado. Tengo muchos valores de NA, por lo que no se les asigna ningún nivel. Cambié NA a "Sin respuesta", pero los niveles de las columnas de factores no contienen ese nivel, así es como comencé, pero no sé cómo terminarlo de una manera elegante:

addNoAnswer = function(df) { factorOrNot = sapply(df, is.factor) levelsList = lapply(df[, factorOrNot], levels) levelsList = lapply(levelsList, function(x) c(x, "No Answer")) ...

¿Hay una manera de aplicar directamente nuevos niveles a las columnas de factores, por ejemplo, algo como esto:

df[, factorOrNot] = lapply(df[, factorOrNot], factor, levelsList)

Por supuesto, esto no funciona correctamente.

Quiero que el orden de los niveles se mantenga y el nivel "Sin respuesta" se agregue al último lugar.


Ampliando la respuesta de ilir y su comentario, puede verificar si una columna es un factor y no contiene el nuevo nivel, luego agregar el nivel y, por lo tanto, volver a ejecutar la función:

addLevel <- function(x, newlevel=NULL) { if(is.factor(x)) { if (is.na(match(newlevel, levels(x)))) return(factor(x, levels=c(levels(x), newlevel))) } return(x) }

Entonces puedes aplicarlo así:

dataFrame$column <- addLevel(dataFrame$column, "newLevel")


Debe convertir la columna en caracteres, a continuación, agregue el nuevo nivel en función de la condición y, a continuación, en la última columna de conversión a factor.

Pasos 1.Primera columna Convertir factor a carácter:

df$column2 <- as.character(column2)

2.Agregar el nuevo nivel

df[df$column1=="XYZ",]column2 <- "new_level"

3.Convertir a factor de nuevo

df$column2 <- as.factor(df$column2)


Desde la última vez que se respondió a esta pregunta, esto ha sido posible utilizando fct_explicit_na() del paquete forcats . Añado aquí el ejemplo dado en la documentación.

f1 <- factor(c("a", "a", NA, NA, "a", "b", NA, "c", "a", "c", "b")) table(f1) # f1 # a b c # 4 2 2 f2 <- forcats::fct_explicit_na(f1) table(f2) # f2 # a b c (Missing) # 4 2 2 3

El valor predeterminado es (Missing) pero se puede cambiar a través del argumento na_level .


La función de levels acepta los levels(x) <- value llamada. Por lo tanto, es muy fácil agregar diferentes niveles:

f1 <- factor(c("a", "a", NA, NA, "b", NA, "a", "c", "a", "c", "b")) str(f1) Factor w/ 3 levels "a","b","c": 1 1 NA NA 2 NA 1 3 1 3 ... levels(f1) <- c(levels(f1),"No Answer") f1[is.na(f1)] <- "No Answer" str(f1) Factor w/ 4 levels "a","b","c","No Answer": 1 1 4 4 2 4 1 3 1 3 ...

Luego puede hacer un bucle alrededor de todas las variables en un data.frame:

f1 <- factor(c("a", "a", NA, NA, "b", NA, "a", "c", "a", "c", "b")) f2 <- factor(c("c", NA, "b", NA, "b", NA, "c" ,"a", "d", "a", "b")) f3 <- factor(c(NA, "b", NA, "b", NA, NA, "c", NA, "d" , "e", "a")) df1 <- data.frame(f1,n1=1:11,f2,f3) str(df1) ''data.frame'': 11 obs. of 4 variables: $ f1: Factor w/ 3 levels "a","b","c": 1 1 NA NA 2 NA 1 3 1 3 ... $ n1: int 1 2 3 4 5 6 7 8 9 10 ... $ f2: Factor w/ 4 levels "a","b","c","d": 3 NA 2 NA 2 NA 3 1 4 1 ... $ f3: Factor w/ 5 levels "a","b","c","d",..: NA 2 NA 2 NA NA 3 NA 4 5 ... for(i in 1:ncol(df1)) if(is.factor(df1[,i])) levels(df1[,i]) <- c(levels(df1[,i]),"No Answer") df1[is.na(df1)] <- "No Answer" str(df1) ''data.frame'': 11 obs. of 4 variables: $ f1: Factor w/ 4 levels "a","b","c","No Answer": 1 1 4 4 2 4 1 3 1 3 ... $ n1: int 1 2 3 4 5 6 7 8 9 10 ... $ f2: Factor w/ 5 levels "a","b","c","d",..: 3 5 2 5 2 5 3 1 4 1 ... $ f3: Factor w/ 6 levels "a","b","c","d",..: 6 2 6 2 6 6 3 6 4 5 ...


Podría definir una función que agregue los niveles a un factor, pero solo devuelve cualquier otra cosa:

addNoAnswer <- function(x){ if(is.factor(x)) return(factor(x, levels=c(levels(x), "No Answer"))) return(x) }

Entonces, simplemente lapply esta función a tus columnas.

df <- as.data.frame(lapply(df, addNoAnswer))

Eso debería devolver lo que quieras.


Tengo una respuesta muy simple que puede no abordar directamente su escenario específico, pero es una forma sencilla de hacerlo en general

levels(df$column) <- c(levels(df$column), newFactorLevel)