2016-01-27 4 views
5

Il pacchetto data.table ha aggiunto una nuova funzione ai dati melt in più colonne contemporaneamente. Questo è molto utile, ma non riesco a capire come preservare il "suffisso" dei nomi delle variabili pre-fuso. Per esempio:Tabella dati fusione e colata utilizzando il modello

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_")) 

risultati nella tabella dei dati:

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 

Questa è la "forma" che voglio, ma le variabili a_3, a_4, b_3 e b_4 sono stati indicizzati 1 e 2. Quello che voglio è la colonna variable per contenere 3,3,3,4,4,4, in base ai suffissi dei nomi delle variabili.

Potrei ovviamente fare questo modo "vecchio stile" con melt, strsplit, dcast, ma è un po 'ingombrante. Spero che una soluzione a una linea sia ancora molto veloce.

risposta

4

Possiamo farlo con splitstackshape. Dà automaticamente la colonna '.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

Perché non basta:

> 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

Che funziona. Stavo evitando qualcosa del genere perché nella mia situazione reale ho migliaia di variabili e non voglio elencare quali sono tutti i loro suffissi. Suppongo che potrei usare 'gsub' nella lista dei nomi delle variabili per isolare tutti i suffissi, ma poi sta diventando abbastanza vicino alla quantità di sforzo nell'approccio' melt', 'strsplit',' dcast' ... – dmp

+0

Il 'c (3,4)' potrebbe essere sostituito con 'sub ("^a_ "," ", names (dt) [grepl ("^a_ ", names (dt))])', eventualmente da ordinare se non sono naturalmente così. –

+0

Grazie. Questo è un po 'la cosa contorta che stavo cercando di evitare. I miei suffissi variabili sono stringhe di caratteri che non sono necessariamente ordinate, e ce ne sono molte. Speravo che ci sarebbe stato un modo "naturale" per usare questa funzionalità di 'melt.data.table', ma posso dare un suggerimento che non c'è. Grazie comunque per il tuo aiuto! – dmp