Tengo un marco de datos R que contiene un factor que quiero "expandir" para que para cada nivel de factor, haya una columna asociada en un nuevo marco de datos, que contiene un indicador 1/0. Por ejemplo, supongamos que tengo:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
Quiero:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
Porque para ciertos análisis para los que necesita tener un marco de datos completamente numérico (por ejemplo, análisis de componentes principales), pensé que esta característica podría estar incorporada. Escribir una función para hacer esto no debería ser demasiado difícil, pero puedo prever algunos desafíos relacionados con los nombres de las columnas y, si ya existe algo, prefiero usarlo.
cast
para mí.?formula
, así como?model.matrix
, pero no estaba claro (podría ser mi falta de profundidad de los conocimientos en álgebra matricial y la formulación del modelo). Después de investigar más, he podido deducir que el -1 solo especifica no incluir la columna "interceptar". Si omite el -1, verá una columna de intercepción de 1 en la salida con una columna binaria omitida. Puede ver qué valores de la columna omitida son 1 según las filas donde los valores de las otras columnas son 0. La documentación parece críptica, ¿hay otro buen recurso?model.matrix(~., data=iris)[,-1]
naresid
para volver a colocar los valores faltantes después de usarna.exclude
. Un ejemplo rápido:tmp <- data.frame(x=factor(c('a','b','c',NA,'a'))); tmp2 <- na.exclude(tmp); tmp3 <- model.matrix( ~x-1, tmp2); tmp4 <- naresid(attr(tmp2,'na.action'), tmp3)
Si su marco de datos solo está formado por factores (o está trabajando en un subconjunto de variables que son todos factores), también puede usar la
acm.disjonctif
función delade4
paquete:No es exactamente el caso que está describiendo, pero también puede ser útil ...
fuente
Una forma rápida de usar el
reshape2
paquete:Tenga en cuenta que esto produce precisamente los nombres de columna que desea.
fuente
ham
una identificación de fila única. Siham
no es un ID único, entonces uno debe usar otro ID único (o crear uno ficticio) y usarlo en lugar deham
. Convertir una etiqueta categórica en un indicador binario solo tendría sentido para ID únicos.probablemente la variable ficticia sea similar a lo que desea. Entonces, model.matrix es útil:
fuente
Una entrada tardía
class.ind
delnnet
paquete.fuente
Me encontré con este viejo hilo y pensé en agregar una función que utiliza ade4 para tomar un marco de datos que consta de factores y / o datos numéricos y devuelve un marco de datos con factores como códigos ficticios.
Vamos a intentarlo.
fuente
Aquí tienes una forma más clara de hacerlo. Utilizo model.matrix para crear las variables booleanas ficticias y luego las fusiono de nuevo en el marco de datos original.
fuente
Necesitaba una función para 'explotar' factores que sea un poco más flexible, e hice una basada en la función acm.disjonctif del paquete ade4. Esto le permite elegir los valores explotados, que son 0 y 1 en acm.disjonctif. Solo explota los factores que tienen "pocos" niveles. Se conservan las columnas numéricas.
fuente