2011-11-22 25 views
11

Esto me hace sentir tonto, pero estoy tratando de producir un solo vector/df/list/etc (cualquier cosa menos una matriz) que concatena dos factores. Aquí está el escenario. Tengo un conjunto de datos de línea de 100k. Usé la mitad superior para predecir la mitad inferior y viceversa usando knn. Así que ahora tengo 2 objetos creados por knn predict().R concatenar dos factores

> head(pred11) 
[1] 0 0 0 0 0 0 
Levels: 0 1 
> head(pred12) 
[1] 0 1 1 0 0 0 
Levels: 0 1 
> class(pred11) 
[1] "factor" 
> class(pred12) 
[1] "factor" 

Aquí es donde empieza mi problema:

> pred13 <- rbind(pred11, pred12) 
> class(pred13) 
[1] "matrix" 

Hay 2 problemas. Primero cambia los 0 y 1 a 1 y 2 y segundo parece crear una gran matriz que se come toda mi memoria. Intenté jugar con as.numeric(), data.frame(), etc., pero no puedo conseguir que combine los 2 factores de 50k en 1 100k uno. ¿Alguna sugerencia?

+0

El título y la descripción me confundieron, parecía que necesitabas una [* interaction *] (https://stat.ethz.ch/pipermail/r-help/2008-November/178808.html) (¿ves? Interacción) de factores, pero de hecho necesitas * concatenación *. "Combinación" es un término bastante ambiguo. Intentaré editar tu pregunta para aclarar esto. – TMS

Respuesta

18

rbind creará una matriz de 2 x 50000 en su caso que no es lo que desea. c es la función correcta para combinar 2 vectores en un único vector más largo. Cuando utiliza rbind o c en un factor, utilizará los enteros subyacentes que se asignan a los niveles. En general es necesario combinar como un personaje antes de refactorización:

x1 <- factor(sample(0:1,10,replace=T)) 
x2 <- factor(sample(0:1,10,replace=T)) 

factor(c(as.character(x1),as.character(x2))) 
[1] 1 1 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 
Levels: 0 1 
+0

Eso lo hizo. ¡Muchas gracias! – screechOwl

26

@ James presentó de una manera, voy a saltar adentro con otro (más corto):

set.seed(42) 
x1 <- factor(sample(0:1,10,replace=T)) 
x2 <- factor(sample(0:1,10,replace=T)) 

unlist(list(x1,x2)) 
# [1] 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 
#Levels: 0 1 

... Esto puede parecer una un poco mágico, pero unlist tiene un apoyo especial para los factores para este propósito en particular! Todos los elementos en la lista deben ser factores para que esto funcione.

+0

Wow. Un poco de aRcana. ¿Dónde aprendiste eso? –

+1

@DWin - Bueno, surgió mientras exploraba las diferencias entre R y S + ... – Tommy

+0

+1000 para la respuesta de Tommy, que permite evitar el uso de 'como.caracter' y al trabajar con factores, esto es __VERY__ agradable –

Cuestiones relacionadas