dados de quadro de remodelagem de factores converter em colunas em R
Pergunta
Eu tenho um quadro de dados onde uma determinada coluna tem um conjunto de valores específicos (digamos Vamos, 1, 2, ..., 23). O que eu gostaria de fazer é converter a partir desta disposição a uma, onde o quadro teria extra de 23 (neste caso) colunas, cada uma representando um dos valores do fator. Os dados nestas colunas seria booleans que indicam se uma determinada linha tinha um determinado valor do fator ... Para mostrar um exemplo específico:
Fonte quadro:
ID DATE SECTOR
123 2008-01-01 1
456 2008-01-01 3
789 2008-01-02 5
... <more records with SECTOR values from 1 to 5>
formato desejado:
ID DATE SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5
123 2008-01-01 T F F F F
456 2008-01-01 F F T F F
789 2008-01-02 F F F F T
Não tenho nenhum problema fazê-lo em um loop, mas eu esperava que houvesse uma maneira melhor. Então reshape()
agora não deu o resultado desejado. Ajuda seria muito apreciada.
Solução
Gostaria de tentar ligar outra coluna chamada "valor" e set value = TRUE
.
df <- data.frame(cbind(1:10, 2:11, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
df <- data.frame(df, value=TRUE)
Em seguida, fazer uma remodelagem:
reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide")
O problema de usar a função reshape
é que o padrão para valores em falta é NA (caso em que você terá que iterate e substituí-los com falsas).
Caso contrário, você pode usar cast
fora do pacote reshape
( ver esta questão para um exemplo ), e definir o padrão para FALSE
.
df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE)
> df.wide
ID DATE 1 2 3
1 1 2 TRUE FALSE FALSE
2 2 3 FALSE TRUE FALSE
3 3 4 FALSE FALSE TRUE
4 4 5 TRUE FALSE FALSE
5 5 6 FALSE TRUE FALSE
6 6 7 FALSE FALSE TRUE
7 7 8 TRUE FALSE FALSE
8 8 9 FALSE TRUE FALSE
9 9 10 FALSE FALSE TRUE
10 10 11 TRUE FALSE FALSE
Outras dicas
Aqui está outra abordagem usando xtabs
que pode ou não pode ser mais rápido (se alguém iria tentar e deixe-me saber):
df <- data.frame(cbind(1:12, 2:13, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df)
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo)