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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top