remodelar ancho a largo con sufijos de caracteres en lugar de sufijos numéricos

Inspirado porun comentario de @ gsk3 en una pregunta sobre la remodelación de datos, comencé a experimentar un poco con la remodelación de datos donde los nombres de las variables tienen sufijos de caracteres en lugar de sufijos numéricos.

Como ejemplo, voy a cargar eldadmomw conjunto de datos de uno de losPáginas de aprendizaje UCLA ATS Stata (Ver "Ejemplo 4" en la página web).

Así es como se ve el conjunto de datos:

<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>

Cuando trato de cambiar la forma de este formato ancho a largo, me encuentro con un problema. Esto es lo que hago para remodelar los datos.

<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>

Anote los nombres de las columnas intercambiadas para "nombre" e "inc"; cambiandov.names ac("inc", "name") no resuelve el problema

reshape Parece muy delicado al querer que las columnas se nombren de una manera bastante estándar. Por ejemplo, puedo remodelar los datos correctamente (y fácilmente) si primero cambio el nombre de las columnas:

<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>

Mis preguntas son:

¿Por qué R está cambiando las columnas en el ejemplo que he proporcionado?¿Puedo llegar a este resultado con base R?reshape ¿Sin cambiar los nombres de las variables antes de remodelarlas?¿Hay otros enfoques que podrían ser considerados en lugar dereshape?

Respuestas a la pregunta(3)

Su respuesta a la pregunta