2012-04-03 9 views
1

Ich importiere eine CSV-Datei, die aus einer Kreuztabelle mit Spaltennamen in einer zweizeiligen Hierarchie besteht. Wenn ich die Tabelle in R zu erhalten, sieht das Ergebnis wie folgt aus:Spaltennamen in mehreren Zeilen?

alpha X.1 X.2 beta X.1 X.2 X.3 gamma X.1 
    var1 var2 var3 var1 var2 var3 var4 var1 var4 
1  21 50 5 22 48 6 8 25 8 
2  27 50 5 24 48 6 8 33 8 
3  26 50 5 28 48 6 8 33 8 
4  25 50 5 28 48 6 8 20 8 

Hier alpha, beta und gamma sind alle eine Ebene der Hierarchie, während var1, var2, var3 und var4 die zweite Ebene sind .

Was ich möchte es tun ist Ausgabe wie folgt erhalten, wo die Zeilennamen verkettet sind, sondern auch unter Berücksichtigung der Struktur der Daten.

alpha_var1 alpha_var2 alpha_var3 beta_var1 beta_var2 beta_var3 beta_var4 gamma_var1 gamma_var4 
1   21   50   5  22   48   6   8   25   8 
2   27   50   5  24   48   6   8   33   8 
3   26   50   5  28   48   6   8   33   8 
4   25   50   5  28   48   6   8   20   8 

Irgendwelche Ideen hier? Ich war nicht in der Lage, etwas zu finden, um mit diesem Problem umzugehen. Danke im Voraus.

+0

... wie sieht die Datei aus? – Tommy

+0

Die Antwort beinhaltet wahrscheinlich zwei Aufrufe von 'read.table()' unter Ausnutzung der Parameter 'skip' und 'nrows'. – Chase

+0

Die Datei ist eine CSV, wobei die X.1, X.2 usw. leere Zellen darstellt. Nicht sicher, wie eine Demo-Datei hochgeladen werden soll. – user1202761

Antwort

1

Dies scheint zu funktionieren, obwohl die Verwendung von xts ein bisschen plump für die na.locf() Funktion scheint, aber ich weiß, es funktioniert und es häufig verwenden, so dass, was ich verwenden.

library(xts) 
#Read in data without headers 
x <- read.delim("Book1.txt", skip = 2, header = FALSE) 
#Read in header files transposing them into columns 
headers <- data.frame(t(read.delim("Book1.txt", nrows = 2, header = FALSE)), stringsAsFactors = FALSE) 

#Create a now column with the value of alpha, beta, gama or NA 
headers$vals <- with(headers, ifelse(grepl("[abg]", X1), X1, NA)) 
#Fill down the values above 
headers$vals <- na.locf(headers$vals) 
#Paste column names together 
colnames(x) <- with(headers, paste(vals, X2, sep = "_")) 
#Resulting object 
x 



alpha_var1 alpha_var2 alpha_var3 beta_var1 beta_var2 beta_var3 beta_var4 gamma_ var1 gamma_var4 
1   21   50   5  22  48   6   8   25   8 
2   27   50   5  24  48   6   8   33   8 
3   26   50   5  28  48   6   8   33   8 
4   25   50   5  28  48   6   8   20   8 
+0

Danke dafür, aber leider suche ich nach einer Lösung, die flexibel für jede Gruppe von Spaltennamen ist. Ich habe es für jede Reihe von Zeichen durch Angabe von grepl ("[a-z]" ...) funktioniert, aber ich würde eine Lösung bevorzugen, die wenn möglich flexibler ist. – user1202761

+0

@ user1202761 - Wie planen Sie, zwischen den Spalten zu unterscheiden, die Sie behalten möchten, und denen, die Sie nicht behalten? Es sollte nicht schwierig sein, die entsprechende Regex zu finden, um die Spalten zu identifizieren, die Sie behalten möchten. Kannst du stattdessen nach dem Muster "X.1-9?" Suchen? So etwas würde funktionieren: '! (Grepl (" X \\. \\ d ", x))'. Es ist das Muster "X" zu finden. gefolgt von einer Ziffer ... dann nehme ich das Negative. – Chase

+0

Die 'X.1' usw. werden automatisch generiert, wenn Sie leere Header-Zellen aus einem CSV importieren. Wenn Sie 'header = FALSE' sagen, erscheinen sie als' '. Ein weiteres Problem ist, dass, wenn eine der Spalten in der ersten und zweiten Ebene "" ist, dies fehlschlägt. – user1202761