изменить ширину на длинную с символьными суффиксами вместо числовых суффиксов

Вдохновленный комментарием от @gsk3 к вопрос об изменении формы данных, я начал немного экспериментировать с изменением формы данных, когда имена переменных имеют суффиксы символов вместо числовых суффиксов.

В качестве примера я загружу набор данных dadmomwс одной из учебных веб-страниц UCLA ATS Stata (, см. «Пример 4» на веб-странице ).

Вот как выглядит набор данных.:

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

При попытке преобразовать этот широкий формат в длинный я столкнулся с проблемой. Вот что я делаю, чтобы изменить данные.

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

Обратите внимание на то, что имена столбцов поменялись местами для «name» и «inc»; замена v.namesна c("inc", "name")не решает проблему.

reshapeкажется очень придирчивым в отношении того, чтобы столбцы назывались довольно стандартным способом. Например, я могу изменить форму данных правильно (и легко ), если сначала переименую столбцы:

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

Мои вопросы::

  1. Почему R меняет местами столбцы в приведенном мной примере?
  2. Могу ли я получить этот результат с основанием R reshapeбез изменения имен переменных перед изменением формы?
  3. Существуют ли другие подходы, которые можно было бы рассмотреть вместо reshape?

15
задан A5C1D2H2I1M1N2O1R2T1 8 January 2018 в 10:14
поделиться