2012-09-20 13 views
5

È possibile modificare il separatore predefinito quando cast (dcast) assegna nuove intestazioni di colonna?Cambia il separatore predefinito nel cast

sto conversione di un file da lungo a largo, e ottengo le seguenti intestazioni:

value_1, value_2, value_3,... 

In rimodellare è possibile assegnare il parametro "SEP" (SEP = "") e l'uscita della colonna intestazioni come io li voglio:

value1, value2, value3,... 

Tuttavia, rimodellare richiede pochi minuti per il mio frame di dati con oltre 200.000 file, mentre dcast richiede solo pochi secondi. dcast emette anche le colonne nell'ordine che voglio, dove non risorge la risagoma. C'è un modo semplice per cambiare l'output con dcast, o devo cambiare manualmente le intestazioni delle colonne?

Ad esempio:

example <- data.frame(id=rep(c(1,2,3,4),4),index=c(rep(1,4),rep(2,4),rep(1,4),rep(2,4)),variable=c(rep("resp",8),rep("conc",8)),value=rnorm(16,5,1)) 
dcast(example,id~variable+index) 

L'esempio fornisce le intestazioni delle colonne:

conc_1, conc_2, resp_1, resp_2 

voglio le intestazioni delle colonne da leggere:

conc1, conc2, resp1, resp2 

ho provato:

dcast(example,id~variable+index,sep="") 

dcast sembra ignorare sep interamente, perché dare un simbolo non cambia nemmeno l'output.

+0

Si prega di includere un esempio riproducibile. –

+0

@mplourde Ho aggiunto un esempio. – dayne

risposta

3

Non è possibile, dal momento che la scelta non è stata incorporata in dcast. Ma è abbastanza banale farlo dopo aver eseguito dcast.

casted_data <- dcast(example,id~variable+index) 


library(stringr) 
names(casted_data) <- str_replace(names(casted_data), "_", ".") 

> casted_data 
    id conc.1 conc.2 resp.1 resp.2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 

# If you need to do this often, just wrap dcast in a function and 
# change the names before returning the result. 

f <- function(df, ..., sep = ".") { 
    res <- dcast(df, ...) 
    names(res) <- str_replace(names(res), "_", sep) 
    res 
} 

> f(example, id~variable+index, sep = "") 
    id conc1 conc2 resp1 resp2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 
+0

So che sostituire i nomi è facile, ma cercavo un modo per aggirare il problema, se possibile. Ho anche altre intestazioni di colonna con un carattere di sottolineatura, quindi ci vorrebbe qualche riga in più di codice, anche se sarebbe ancora abbastanza facile. – dayne

+0

Questo è il modo per aggirare. Potresti riscrivere 'dcast' e le funzioni interne da' reshape2', ma sarebbe ancora più inutile. Il wrapping in una funzione lo lascerà allo stesso numero di righe di codice (solo 1) – Maiasaura

+0

Grazie a entrambi. – dayne

1

Una possibilità:

example <- data.frame(example,by=paste(example$variable,example$index,sep="")) 
dcast(example,id~by) 
2

dcast nel pacchetto data.table (dev versione 1.9.5) ha ora l'argomento 'settembre'.

+0

1.9.5 è obsoleto e @arekolek sopra fornisce una risposta più completa che incorpora questo – MichaelChirico

2

Sulla base information provided by dbetebenner e un altro esempio di using data.table for improved dcast functionality, il tuo esempio diventa:

> library(data.table) 
> dcast(setDT(example), id ~ variable + index, sep="") 
    id conc1 conc2 resp1 resp2 
1: 1 5.113707 5.475527 5.938592 4.149636 
2: 2 4.261278 6.138082 5.277773 5.907054 
3: 3 4.350663 4.292398 6.277582 4.167552 
4: 4 5.993198 6.601669 5.232375 5.037936 

setDT() converte liste e data.frames-data.tables per riferimento.

testato con data.table v1.9.6.