vectores two studio operator concatenate concatenar columns r concatenation r-factor

two - concatenate words in r



¿Cómo concatenar factores sin que se conviertan a un nivel entero? (7)

Me sorprendió ver que R forzará factores en un número al concatenar vectores. Esto sucede incluso cuando los niveles son los mismos. Por ejemplo:

> facs <- as.factor(c("i", "want", "to", "be", "a", "factor", "not", "an", "integer")) > facs [1] i want to be a factor not an integer Levels: a an be factor i integer not to want > c(facs[1 : 3], facs[4 : 5]) [1] 5 9 8 3 1

¿Cuál es la forma idiomática de hacer esto en R (en mi caso, estos vectores pueden ser bastante grandes)? Gracias.


Aquí hay otra forma de agregar a una variable de factor cuando la configuración es ligeramente diferente:

facs <- factor(1:3, levels=1:9, labels=c("i", "want", "to", "be", "a", "factor", "not", "an", "integer")) facs # [1] i want to be a factor not an integer # Levels: a an be factor i integer not to want facs[4:6] <- levels(facs)[4:6] facs # [1] i want to be a factor # Levels: i want to be a factor not an integer


Wow, nunca me di cuenta de que eso sucedió. Aquí hay una solución alternativa:

x <- c(facs[1 : 3], facs[4 : 5]) x <- factor(x, levels=1:nlevels(facs), labels=levels(facs)) x

Con la salida:

[1] i want to be a Levels: a an be factor i integer not to want

Solo funcionará si los dos vectores tienen los mismos niveles que aquí.


Una solución alternativa consiste en convertir el factor en un vector de caracteres, luego convertir de nuevo cuando se concatena.

cfacs <- as.character(facs) x <- c(cfacs[1:3], cfacs[4:5]) # Now choose between factor(x) # and factor(x, levels = levels(facs))


De la lista de correo de R :

unlist(list(facs[1 : 3], facs[4 : 5]))

Para ''cbind'' factores, hacer

data.frame(facs[1 : 3], facs[4 : 5])


Esta es una muy mala R gotcha. En ese sentido, aquí hay uno que simplemente tragó varias horas de mi tiempo.

x <- factor(c("Yes","Yes","No", "No", "Yes", "No")) y <- c("Yes", x) > y [1] "Yes" "2" "2" "1" "1" "2" "1" > is.factor(y) [1] FALSE

Me parece que la mejor solución es la de Richie, que coacciona al personaje.

> y <- c("Yes", as.character(x)) > y [1] "Yes" "Yes" "Yes" "No" "No" "Yes" "No" > y <- as.factor(y) > y [1] Yes Yes Yes No No Yes No Levels: No Yes

Siempre y cuando tengas los niveles establecidos correctamente, como Richie menciona.


En función de las otras respuestas que usan conversión a carácter, estoy usando la siguiente función para concatenar factores:

concat.factor <- function(...){ as.factor(do.call(c, lapply(list(...), as.character))) }

Puede usar esta función del mismo modo que usaría c .


Por esta razón, prefiero trabajar con factores dentro de data.frames:

df <- data.frame(facs = as.factor( c("i", "want", "to", "be", "a", "factor", "not", "an", "integer") ))

y lo subconjunto utilizando subconjunto () o dplyr :: filter () etc. en lugar de índices de fila. Debido a que no tengo criterios de subconjuntos significativos en este caso, usaré head () y tail ():

df1 <- head(df, 4) df2 <- tail(df, 2)

Entonces puede manipularlos con bastante facilidad, por ejemplo:

dfc <- rbind(df1, df2) dfc$facs #[1] i want to be an integer #Levels: a an be factor i integer not to want