Eu tenho um quadro de dados R contendo um fator que desejo "expandir" para que, para cada nível de fator, haja uma coluna associada em um novo quadro de dados, que contém um indicador 1/0. Por exemplo, suponha que eu tenha:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
Eu quero:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
Porque para certas análises para as quais você precisa ter um quadro de dados completamente numérico (por exemplo, análise de componente principal), pensei que esse recurso poderia ser integrado. Escrever uma função para fazer isso não deve ser muito difícil, mas posso prever alguns desafios relacionados aos nomes das colunas e se algo já existir, prefiro usar isso.
cast
para mim.?formula
também?model.matrix
, mas não estava claro (pode ser apenas minha falta de conhecimento profundo em álgebra de matrizes e formulação de modelos). Depois de cavar mais, fui capaz de concluir que o -1 está apenas especificando para não incluir a coluna "interceptar". Se você omitir -1, verá uma coluna de interceptação de 1 na saída com uma coluna binária omitida. Você pode ver quais valores a coluna omitida são 1s com base nas linhas em que os valores das outras colunas são 0s. A documentação parece enigmática - existe outro bom recurso?model.matrix(~., data=iris)[,-1]
naresid
para colocar os valores ausentes de volta após o usona.exclude
. Um exemplo 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)
Se seu quadro de dados for feito apenas de fatores (ou se você estiver trabalhando em um subconjunto de variáveis que são todos fatores), você também pode usar a
acm.disjonctif
função doade4
pacote:Não é exatamente o caso que você está descrevendo, mas também pode ser útil ...
fonte
Uma maneira rápida de usar o
reshape2
pacote:Observe que isso produz precisamente os nomes de coluna que você deseja.
fonte
ham
é um ID de linha exclusivo Seham
não for um id único, deve-se usar algum outro id único (ou criar um fictício) e usá-lo no lugar deham
. Converter um rótulo categórico em um indicador binário só faria sentido para IDs únicos.provavelmente a variável fictícia é semelhante ao que você deseja. Então, model.matrix é útil:
fonte
Uma entrada tardia
class.ind
donnet
pacotefonte
Acabei de encontrar este velho tópico e pensei em adicionar uma função que utiliza ade4 para pegar um dataframe consistindo em fatores e / ou dados numéricos e retornar um dataframe com fatores como códigos fictícios.
Vamos tentar.
fonte
Aqui está uma maneira mais clara de fazer isso. Eu uso model.matrix para criar as variáveis booleanas fictícias e, em seguida, mesclá-las de volta ao dataframe original.
fonte
Eu precisava de uma função para 'explodir' fatores que fosse um pouco mais flexível, e fiz uma baseada na função acm.disjonctif do pacote ade4. Isso permite que você escolha os valores explodidos, que são 0 e 1 em acm.disjonctif. Explode apenas fatores que têm 'poucos' níveis. As colunas numéricas são preservadas.
fonte