2016-01-27 4 views
5

Das data.table Paket fügte eine neue Funktion melt Daten in mehrere Spalten gleichzeitig hinzu. Das ist sehr nützlich, aber ich kann nicht herausfinden, wie man das "Suffix" der vorher geschmolzenen Variablennamen erhält. Zum Beispiel:Schmelz- und Umwandlungsdatentabelle mit Muster

library(data.table) 

# create data table 
dt <- data.table(id = seq(3), a_3 = seq(3), a_4 = seq(4, 6), b_3 = seq(7, 9), b_4 = seq(10, 12)) 

# melt and cast in one step using new feature 
m1 <- melt(dt, id.vars='id', measure=patterns("a_", "b_"), value.name=c("a_", "b_")) 

Ergebnisse in der Datentabelle:

id variable a_ b_ 
1: 1  1 1 7 
2: 2  1 2 8 
3: 3  1 3 9 
4: 1  2 4 10 
5: 2  2 5 11 
6: 3  2 6 12 

Dies ist die "Form" ich will, aber die Variablen a_3, a_4, b_3 und b_4 haben 1 und 2 indexiert. Was ich will, ist die variable Spalte zu enthalten 3,3,3,4,4,4, nach den Suffixen der Variablennamen.

Ich könnte natürlich das "altmodische" Weg mit melt, strsplit, dcast tun, aber das ist irgendwie umständlich. Ich hoffe auf eine One-Line-Lösung, die immer noch sehr schnell ist.

Antwort

4

Wir können mit splitstackshape dies tun. Es gibt automatisch die Spalte ".time_1"

library(splitstackshape) 
merged.stack(dt, var.stubs=c("a", "b"), sep="_") 
# id .time_1 a b 
#1: 1  3 1 7 
#2: 1  4 4 10 
#3: 2  3 2 8 
#4: 2  4 5 11 
#5: 3  3 3 9 
#6: 3  4 6 12 
2

Warum nicht einfach:

> m1[ , variable:= c(3,4)[variable] ] 
> m1 
    id variable a_ b_ 
1: 1  3 1 7 
2: 2  3 2 8 
3: 3  3 3 9 
4: 1  4 4 10 
5: 2  4 5 11 
6: 3  4 6 12 
+0

Das funktioniert. Ich habe so etwas gemieden, weil ich in meiner realen Situation Tausende von Variablen habe und nicht auflisten möchte, was all ihre Suffixe sind. Ich nehme an, ich könnte 'gsub' auf der Liste der Variablennamen verwenden, um alle Suffixe zu isolieren, aber dann wird es ziemlich nah an der Menge an Aufwand in der 'schmelzen', 'strsplit', 'dcast' Ansatz ... – dmp

+0

Das 'c (3,4)' könnte durch 'sub ("^a_ "," ", Namen (dt) [grepl ("^a_ ", Namen (dt))])' ersetzt werden, die möglicherweise sortiert werden müssen wenn sie nicht natürlich so sind. –

+0

Danke. Das ist eine Art der verwickelten Sache, die ich vermeiden wollte. Meine Variablensuffixe sind Zeichenfolgen, die nicht unbedingt sortiert sind, und es gibt viele davon. Ich hatte gehofft, dass es eine "natürliche" Art und Weise geben würde, diese Funktion von 'melt.data.table' zu ​​verwenden, aber ich kann einen Hinweis darauf nehmen, dass dies nicht der Fall ist. Danke für deine Hilfe trotzdem! – dmp