przekształcić szeroki na długi z przyrostkami znaków zamiast przyrostków numerycznych
Zainspirowany przezkomentarz z @ gsk3 na pytanie o zmianę danych, zacząłem trochę eksperymentować z przekształcaniem danych, gdzie nazwy zmiennych mają przyrostki znaków zamiast przyrostków numerycznych.
Jako przykład załadujędadmomw
zbiór danych z jednego zStrony internetowe UCLA ATS Stata (patrz „Przykład 4” na stronie internetowej).
Oto jak wygląda zestaw danych:
<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>
Podczas próby zmiany kształtu z tego szerokiego formatu na długi napotykam problem. Oto, co robię, aby zmienić kształt danych.
<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>
Zwróć uwagę na zamienione nazwy kolumn dla „nazwa” i „inc”; wymiana pieniędzyv.names
doc("inc", "name")
nie rozwiązuje problemu.
reshape
wydaje się bardzo wybredny, jeśli chodzi o to, aby kolumny były nazywane w dość standardowy sposób. Na przykład mogę poprawnie przekształcić dane (i łatwo), jeśli najpierw zmienię nazwę kolumn:
<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>
Moje pytania to:
Dlaczego R zamienia kolumny w podanym przykładzie?Czy mogę uzyskać ten wynik z podstawą Rreshape
bez zmiany nazw zmiennych przed zmianą kształtu?Czy istnieją inne podejścia, które można rozważyć zamiastreshape
?