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

questionAnswers(4)

yourAnswerToTheQuestion