remodelar largamente para longo com sufixos de caracteres em vez de sufixos numéricos

Inspirado porum comentário de @ gsk3 em uma questão sobre remodelar dados, comecei a fazer um pouco de experimentação com dados de reformulação em que os nomes das variáveis ​​têm sufixos de caracteres em vez de sufixos numéricos.

Por exemplo, vou carregar odadmomw conjunto de dados de um dosPáginas de aprendizagem UCLA ATS Stata (veja "Exemplo 4" na página da web).

Veja como é o conjunto de dados:

<code>library(foreign)
dadmom <- read.dta("https://stats.idre.ucla.edu/stat/stata/modules/dadmomw.dat")
dadmom
#   famid named  incd namem  incm
# 1     1  Bill 30000  Bess 15000
# 2     2   Art 22000   Amy 18000
# 3     3  Paul 25000   Pat 50000
</code>

Ao tentar remodelar esse formato amplo para muito tempo, me deparo com um problema. Aqui está o que eu faço para remodelar os dados.

<code>reshape(dadmom, direction="long", idvar=1, varying=2:5, 
        sep="", v.names=c("name", "inc"), timevar="dadmom",
        times=c("d", "m"))
#     famid dadmom  name  inc
# 1.d     1      d 30000 Bill
# 2.d     2      d 22000  Art
# 3.d     3      d 25000 Paul
# 1.m     1      m 15000 Bess
# 2.m     2      m 18000  Amy
# 3.m     3      m 50000  Pat
</code>

Observe os nomes das colunas trocadas para "name" e "inc"; mudandov.names parac("inc", "name") não resolve o problema.

reshape Parece muito exigente sobre querer que as colunas sejam nomeadas de uma forma bastante normal. Por exemplo, posso remodelar os dados corretamente (e facilmente) se eu renomear as colunas pela primeira vez:

<code>dadmom2 <- dadmom # Just so we can continue experimenting with the original data
# Change the names of the last four variables to include a "."
names(dadmom2)[2:5] <- gsub("(d$|m$)", "\\.\\1", names(dadmom2)[2:5])
reshape(dadmom2, direction="long", idvar=1, varying=2:5, 
        timevar="dadmom")
#     famid dadmom name   inc
# 1.d     1      d Bill 30000
# 2.d     2      d  Art 22000
# 3.d     3      d Paul 25000
# 1.m     1      m Bess 15000
# 2.m     2      m  Amy 18000
# 3.m     3      m  Pat 50000
</code>

Minhas perguntas são:

Por que R está trocando as colunas no exemplo que eu forneci?Posso chegar a este resultado com base Rreshape sem alterar os nomes das variáveis ​​antes de reformular?Existem outras abordagens que poderiam ser consideradas em vez dereshape?

questionAnswers(3)

yourAnswerToTheQuestion