2017-10-06 14 views
0

Ich habe einen Datenrahmen derzeit in einem breiten Format, das vor und nach der Intervention Fragebögen hat. Es gibt 848 Patienten mit mindestens einem Fragebogen. Ich würde gerne die Daten betrachten, um zu vergleichen, wie sich die Werte von vor und nach der Intervention geändert haben. Ich kämpfe jedoch, da diese Daten in einem breiten Format vorliegen und die Daten hinsichtlich der Anzahl der Fragebögen pro Patient nicht einheitlich sind. Es gibt eine Variable, die die Instanz des Fragebogens auflistet und der Wert des Fragebogens ist eine weitere Variable. HierKombinieren von Variablen im Wide-Format in R

ist ein Beispiel dafür, wie es aussieht, zur Zeit:

a=c('instance1','total1','instance2', 'total2', 'instance3', 'total3', 
'instance4','total4', 'instance5','total5') 
b=c('postop2', '5', 'postop1', '7', NA, NA, 'preop', '10', NA, NA) 
c=c(NA, NA, 'preop', '3', NA, NA, 'postop1', '4', 'postop2', '3') 
data.frame(rbind(a,b,c)) 

Es gibt 848 Zeilen von Befragungsdaten.

Ich muss die Unterschiede von Preop zu Postop Fragebögen berechnen. Was ist der beste Weg, um diese Daten zu reorganisieren, damit ich diese Werte bekommen kann? Ich kämpfe, da die Fälle nicht zwischen allen 848 Patienten liegen.

Danke für Ihre Hilfe.

+0

Wenn Sie Ihr Beispiel betrachten, nehme ich an, dass die Spaltennamen die erste Zeile anstelle von 'X1', 'X2' usw. wären. – akrun

+0

ja, Spaltennamen sind die erste Zeile –

Antwort

2

nicht sicher, ob dies ist, was Sie sind, aber versuchen, diese data.table Ansatz:

library(data.table) 

DT <- data.table(rbind(b,c)) 
names(DT) <- a 

DT2 <- melt(DT, measure = patterns("^instance", "^total"), value.name = c("instance", "total")) 

DT2 

    variable instance total 
1:  1 postop2  5 
2:  1  NA NA 
3:  2 postop1  7 
4:  2 preop  3 
5:  3  NA NA 
6:  3  NA NA 
7:  4 preop 10 
8:  4 postop1  4 
9:  5  NA NA 
10:  5 postop2  3 

EDIT:

Wenn Sie eine Zusammenfassung möchten können Sie auch dies tun:

DT2$total <- as.numeric(DT2$total) # for some reason total is class character 

DT2[, sum(total), by=instance] 

    instance V1 
1: postop2 8 
2:  NA NA 
3: postop1 11 
4: preop 13 
+0

Jeppe, das funktioniert auf t er Beispieldaten. Wenn ich es jedoch auf meine Daten anwende, erhält es nur für einige Instanzen Summen. Wenn ich also die Mittelwerte errechne, gibt es nur die Mittelwerte für "NA" und "postop2" zurück. Könnte das ein Problem mit dem Schmelzen in das lange Format sein? Irgendwelche Vorschläge, wo Sie anfangen sollten, würden geschätzt werden. Vielen Dank. –

+0

Wahrscheinlich wegen der NA in Ihrem Datensatz. Versuchen Sie DT2 <- na.omit (DT2) –

+0

Ich versuchte dies, aber es lässt die gesamte Datenrahmen/Datentabelle aus. –