2017-11-30 1 views
1

habe ich eine Umfrage Daten wie folgt festgelegt:reshape Umfragedaten von Weit auf langen

df <- data.frame(
    employment = 0.45, 
    income = 0.3, 
    incomeFU1 = 0.4, 
    married = 0.1, 
    employmentFU1 = 0.7, 
    employmentFU2 = 0.8, 
    incomeFU2 = 0.8, 
    smokingFU1 = 0.6, 
    smokingFU3 = 0.1, 
    ageFU3 = 0.9, 
    marriedFU2 = 0.3 
) 

In diesem Datensatz, Einzelpersonen über ihren Beschäftigungsstatus gefragt wurde, Einkommen usw. Die Daten auf einer aggregrate sind Stellen Sie sich dies als den Anteil aller Menschen vor, die eine Beschäftigung, ein mittleres Einkommen usw. haben. Daher hat der Datensatz nur eine Zeile.

Personen in dieser Umfrage wurden bei Baseline und 3 Follow-ups gefragt. Baseline-Variablen haben keine Endzeichenfolge, Follow-up-Antworten haben eine Endung wie "FU1" für Folge 1 und so weiter.

ich jetzt eine zweite Liste dieser Variablen:

l <- list() 
l[[1]] <- c("employment", "income", "married") 
l[[2]] <- c("employmentFU1", "incomeFU1", "smokingFU1") 
l[[3]] <- c("employmentFU2", "incomeFU2", "marriedFU2") 
l[[4]] <- c("smokingFU3", "ageFU3") 

das erste Listenelement Baseline-Variablen hat, das zweite Listenelement hat Follow-up-1 Variablen hat die dritte Follow-up-2 usw.

Beachten Sie, dass einige Variablen in 2 oder 3 (manchmal sogar alle) Nachverfolgungen verfügbar sind, einige nur einmal.

Ich möchte nun diesen Datenrahmen neu zu gestalten, basierend auf den Listenvariablen zu einer Matrix oder Datenrahmen wie folgt aus:

employment  income   married    NA   NA 
employmentFU1 incomeFU1   NA  smokingFU1   NA 
employmentFU2 incomeFU2 marriedFU2    NA   NA 
      NA   NA   NA  smokingFU3  ageFU3 

die Anzahl der Zeilen in dieser Matrix ist die Anzahl der Listenelemente, 4 in dieser Fall.

habe ich versucht, so etwas, aber sehr weit nicht bekommen:

m <- matrix() 
m[1,1] <- df[, l[[1]][1]] 
m[1,2] <- l[[2]][str_detect(l[[1]][1], l[[2]])] 
+0

Sollte 'RauchenFU3' in der vierten Reihe sein (nicht drittes wie im Beispiel)? – storaged

+0

@storaged Sie haben Recht, sorry, ich habe das korrigiert – spore234

+0

Ich bin nur neugierig, funktioniert die Lösung unten für Sie? – storaged

Antwort

1

Dies ist, wie ich zu diesem Problem stringr verwenden versuchen würde. Wahrscheinlich könnte es etwas effizienteres existieren

library(stringr) 
table <- str_match(unlist(l), "(.*?)($|FU[0-9]+?)") 
table[table==""] <- "FU0" ## "" is problematic 

m <- matrix(NA, length(unique(table[,3])), length(unique(table[,2]))) 
colnames(m) <- unique(table[,2]) 
rownames(m) <- unique(table[,3]) 

foo <- apply(table, 1, function(row) m[row[3],row[2]] <<- row[1]) 

print(m) 
# employment  income  married  smoking  age 
#FU0 "employment" "income" "married" NA   NA 
#FU1 "employmentFU1" "incomeFU1" NA   "smokingFU1" NA 
#FU2 "employmentFU2" "incomeFU2" "marriedFU2" NA   NA 
#FU3 NA    NA   NA   "smokingFU3" "ageFU3"