2017-01-30 11 views
0

Ich habe ein Problem bei der Verwendung von R zum Bereinigen eines Datensatzes festgestellt.Daten in R bereinigen (oder vielleicht restrukturieren/umformen) (hauptsächlich zum Umgang mit fehlenden Daten)

Das Original-Datensatz geht wie folgt aus:

ID St Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 gen ho gu qu 
1 a NA NA NA NA NA NA 1 2 3 4 1 2 1 2 
2 b NA NA NA NA NA NA NA NA 1 2 3 4 1 2 
3 c 1 2 3 NA NA NA NA NA NA NA 1 2 1 2 
4 d 1 NA 2 3 NA NA NA NA NA NA 3 4 1 2 
5 e 1 2 3 4 5 NA NA NA NA NA 1 2 1 2 
6 f NA NA NA 1 2 3 4 NA NA NA 3 4 1 2 

ich es auf das folgende Format neu zu gestalten geplant (wir es format1 nennen):

ID St Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 gen ho gu qu 
1 a 1 2 3 4 NA NA NA NA NA NA 1 2 1 2 
2 b 1 2 NA NA NA NA NA NA NA NA 3 4 1 2 
3 c 1 2 3 NA NA NA NA NA NA NA 1 2 1 2 
4 d 1 2 3 NA NA NA NA NA NA NA 3 4 1 2 
5 e 1 2 3 4 5 NA NA NA NA NA 1 2 1 2 
6 f 1 2 3 4 NA NA NA NA NA NA 3 4 1 2 

Oder diese (format2, einfach löschen die columes im format1, die alle NA enthalten):

ID St Q1 Q2 Q3 Q4 Q5 gen ho gu qu 
1 a 1 2 3 4 NA 1 2 1 2 
2 b 1 2 NA NA NA 3 4 1 2 
3 c 1 2 3 NA NA 1 2 1 2 
4 d 1 2 3 NA NA 3 4 1 2 
5 e 1 2 3 4 5 1 2 1 2 
6 f 1 2 3 4 NA 3 4 1 2 

Kann mir jemand helfen und unterrichten Wie macht man das Umformen in R? Vielen Dank!

Antwort

0

Wir können dies mit apply zur Schleife über die Reihen der ‚Q‘ Spalten, die Nicht-NA-Elemente mit den NA-Elementen anzuhängen, die Ausgabe umsetzen und es an die Spalten von Interesse zuzuordnen

nm1 <- grep("Q\\d+", names(df)) 
df[nm1] <- t(apply(df[nm1], 1, function(x) c(x[!is.na(x)], x[is.na(x)]))) 
df 
# ID St Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 gen ho gu qu 
#1 1 a 1 2 3 4 NA NA NA NA NA NA 1 2 1 2 
#2 2 b 1 2 NA NA NA NA NA NA NA NA 3 4 1 2 
#3 3 c 1 2 3 NA NA NA NA NA NA NA 1 2 1 2 
#4 4 d 1 2 3 NA NA NA NA NA NA NA 3 4 1 2 
#5 5 e 1 2 3 4 5 NA NA NA NA NA 1 2 1 2 
#6 6 f 1 2 3 4 NA NA NA NA NA NA 3 4 1 2 
+0

@vic Kein Problem. Sie können auch [hier] (http://stackoverflow.com/help/someone-answers) – akrun

+0

überprüfen, wenn die Zahlen in Q1 bis Q10 zu String-Variablen werden, wie zum Beispiel "psychologische Abteilung" anstatt 1, wissen Sie, wie es geht es? Ich habe deine Methode ausprobiert. Es funktioniert nicht für die String-Variablen ... traurig ... – vic

+0

@vic Wenn es ein Muster in den Spaltennamen gibt, können wir 'grep' verwenden. Aber wenn Ihre Spaltennamen "psychologische Departements", "wilde Feuer", "Erdbeeren" sind, die keine Verbindung haben, ist es besser, entweder 'Namen (df1) [c (1, 3, 5)]' wo zu verwenden 1, 3, 5 schlägt den Spaltenindex oder nur den Spaltenindex vor, um ihn zu unterteilen – akrun

0

Sie können sort() mit der Option na.last verwenden, die auf die entsprechenden Spalten angewendet wird.

Kleines Arbeitsbeispiel:

df <- data.frame(ID = 1:2, 
       St = c("a","b"), 
       Q1 = c(1,NA), 
       Q2 = c(2, NA), 
       Q3 = c(NA, 1), 
       Q4 = c(NA, 2), 
       gen = c(1,3)) 

df[,3:6] <- t(apply(df[,3:6], 1, function(x) sort(x, na.last = TRUE))) 

    ID St Q1 Q2 Q3 Q4 gen 
1 1 a 1 2 NA NA 1 
2 2 b 1 2 NA NA 3