Alternativas às estatísticas :: remodelar
As funções de fusão / conversão no pacote de remodelação são ótimas, mas não tenho certeza se existe uma maneira simples de aplicá-las quando variáveis medidas são de tipos diferentes. Por exemplo, aqui está um trecho de dados em que cada MD fornece o sexo e o peso de três pacientes:
ID PT1 WT1 PT2 WT2 PT3 WT3
1 "M" 170 "M" 175 "F" 145
...
onde o objetivo é remodelar para que cada linha seja um paciente:
ID PTNUM GENDER WEIGHT
1 1 "M" 170
1 2 "M" 175
1 3 "F" 145
...
Usar a função remodelar no pacote de estatísticas é uma das opções que eu conheço, mas estou postando aqui na esperança de que usuários R mais experientes que eu publiquem outros métodos, espero que sejam melhores. Muito Obrigado
-
@ Vincent Zoonekynd:
Gostei muito do seu exemplo, então o generalizei para várias variávei
# Sample data
n <- 5
d <- data.frame(
id = 1:n,
p1 = sample(c("M","F"),n,replace=TRUE),
q1 = sample(c("Alpha","Beta"),n,replace=TRUE),
w1 = round(runif(n,100,200)),
y1 = round(runif(n,100,200)),
p2 = sample(c("M","F"),n,replace=TRUE),
q2 = sample(c("Alpha","Beta"),n,replace=TRUE),
w2 = round(runif(n,100,200)),
y2 = round(runif(n,100,200)),
p3 = sample(c("M","F"),n,replace=TRUE),
q3 = sample(c("Alpha","Beta"),n,replace=TRUE),
w3 = round(runif(n,100,200)),
y3 = round(runif(n,100,200))
)
# Reshape the data.frame, one variable at a time
library(reshape)
d1 <- melt(d, id.vars="id", measure.vars=c("p1","p2","p3","q1","q2","q3"))
d2 <- melt(d, id.vars="id", measure.vars=c("w1","w2","w3","y1","y2","y3"))
d1 = cbind(d1,colsplit(d1$variable,names=c("var","ptnum")))
d2 = cbind(d2,colsplit(d2$variable,names=c("var","ptnum")))
d1$variable = NULL
d2$variable = NULL
d1c = cast(d1,...~var)
d2c = cast(d2,...~var)
# Join the two data.frames
d3 = merge(d1c, d2c, by=c("id","ptnum"), all=TRUE)
-
Pensamentos finais: minha motivação para esta pergunta foi aprender outras alternativas ao pacote de remodelação que não a função stats :: reshape. No momento, cheguei às seguintes conclusões:
Stick para stats :: remodelar quando possível. Desde que você se lembre de usar uma lista em vez de um vetor simples para o argumento "variável", você ficará longe de problemas. Para conjuntos de dados menores - alguns milhares de casos de pacientes com menos de 200 variáveis no total é o que eu estava lidando neste momento - a velocidade mais baixa dessa função vale a simplicidade do códig
Para usar a abordagem de conversão / derretimento no pacote reformular (ou reformular2) de Hadley Wickham, você deve dividir suas variáveis em dois conjuntos, um composto por variáveis numéricas e outro por variáveis de caracteres. Quando seu conjunto de dados é grande o suficiente para que você ache o stats :: remodelar insuportável, imagino que a etapa extra de dividir suas variáveis em dois conjuntos não pareça tão rui