Quiero cambiar el nombre de algunos valores en una columna de mis datos que aparecen menos de 5 veces.

     Var1   Var2
1     A    High
2     A    High
3     A    High
4     B    High
5     B    Med
6     B    Vlow
7     C    Vlow
8     C    Low
9     C    Low
10    C    Low
11    A    High
12    B    Hlow
13    C    Med
14    A    Low
15    A    Low

Entonces, en este caso, quiero cambiar el nombre de los valores de la columna Var2 a "otros" que aparecen menos de 5 veces (Hlow, Med, Vlow). El resultado esperado debería ser:

   Var1  Var2
1     A  High
2     A  High
3     A  High
4     B  High
5     B Other
6     B Other
7     C Other
8     C   Low
9     C   Low
10    C   Low
11    A  High
12    B Other
13    C Other
14    A   Low
15    A   Low

Aquí está el dput() de mi marco de datos:

structure(list(Var1 = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 1L, 2L, 3L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
    Var2 = structure(c(1L, 1L, 1L, 1L, 4L, 5L, 5L, 3L, 3L, 3L, 
    1L, 2L, 4L, 3L, 3L), .Label = c("High", "Hlow", "Low", "Med", 
    "Vlow"), class = "factor")), .Names = c("Var1", "Var2"), class = "data.frame", row.names = c(NA, 
-15L))

Ambas columnas son variables categóricas (factores).

r
-2
Sina PN 15 dic. 2016 a las 23:24

2 respuestas

La mejor respuesta

Como Var2 es un factor, puede usar el nuevo paquete forcats de Hadley:

nlevels_to_keep <- sum(table(df$Var2) >= 5)
df$Var2 <- forcats::fct_lump(df$Var2, n = nlevels_to_keep)
df
#   Var1  Var2
#1     A  High
#2     A  High
#3     A  High
#4     B  High
#5     B Other
#6     B Other
#7     C Other
#8     C   Low
#9     C   Low
#10    C   Low
#11    A  High
#12    B Other
#13    C Other
#14    A   Low
#15    A   Low

Explicación

La función fct_lump() agrupa los niveles más comunes / mínimos en "otros" . Un valor positivo para el parámetro n especifica mantener los niveles n más comunes ("superiores").

Para obtener los n niveles superiores que se van a mantener, tenemos que contar las apariciones de cada nivel en Var2 usando table(). Luego miramos cuántas veces el recuento es igual o mayor a 5. Aquí, estamos usando el "truco" de que FALSE se convierte en 0 y TRUE se convierte en 1 cuando se convierte a entero. Por tanto, sum() devuelve el número de TRUE s.

Datos

df <- read.table(header = TRUE, text = "Var1   Var2
A    High
A    High
A    High
B    High
B    Med
B    Vlow
C    Vlow
C    Low
C    Low
C    Low
A    High
B    Hlow
C    Med
A    Low
A    Low")
1
Uwe 16 dic. 2016 a las 06:49

Empiece por utilizar table para determinar qué valores de Var2 son menores que su umbral.

freqs <- table(df[["Var2"]])
lowVals <- names(freqs[freqs < 5])

Ahora podemos usar %in% para indexar en Var2 en los valores que son menores que freq y reemplazarlo con Other.

df[["Var2"]][df[["Var2"]] %in% lowVals] <- "Other"
1
Barker 16 dic. 2016 a las 00:19