2012-09-20 25 views
5

¿Es posible cambiar el separador predeterminado cuando el molde (dcast) asigna nuevos encabezados de columna?Cambiar el separador predeterminado en el molde

Estoy convirtiendo un archivo de largo a ancho, y consigo los siguientes encabezados:

value_1, value_2, value_3,... 

En cambio de forma puede asignar el parámetro "sep" (sep = "") y la salida de las cabeceras de columna como los quiero a:

value1, value2, value3,... 

Sin embargo, remodelar el acta correspondiente para mi trama de datos con más de 200.000 filas, mientras que dcast toma unos segundos. dcast también genera las columnas en el orden que yo quiero, donde la remodelación no lo hace. ¿Hay alguna manera fácil de cambiar la salida con dcast, o necesito cambiar los encabezados de columna manualmente?

Por ejemplo:

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) 

El ejemplo da los títulos de las columnas:

conc_1, conc_2, resp_1, resp_2 

Quiero que los encabezados de columna para que diga:

conc1, conc2, resp1, resp2 

que he intentado:

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

dcast parece ignorar sep completamente, porque dar un símbolo tampoco cambia la salida.

+0

Incluya un ejemplo reproducible. –

+0

@mplourde He añadido un ejemplo. – dayne

Respuesta

3

No se puede, ya que esa opción no se incorporó al dcast. Pero es bastante trivial hacer esto después de ejecutar 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

Sé que reemplazar los nombres es fácil, pero si era posible, estaba buscando una forma de evitarlo. También tengo otros encabezados de columna con un guión bajo, por lo que tomaría algunas líneas más de código, aunque todavía sería bastante fácil. – dayne

+0

Este _es_ el camino correcto. Podrías reescribir 'dcast' y las funciones internas de' reshape2' pero eso sería aún más trabajo y completamente innecesario. Envolver una función la dejará en el mismo número de líneas de código (solo 1) – Maiasaura

+0

Gracias a ambos. – dayne

1

Una opción:

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

dcast en el paquete data.table (dev versión 1.9.5) tiene ahora el argumento 'SEP'.

+0

1.9.5 está obsoleto y @arekolek arriba proporciona una respuesta más completa al incorporar este – MichaelChirico

2

Basado en information provided by dbetebenner y otro ejemplo de using data.table for improved dcast functionality, su ejemplo se convierte en:

> 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() convierte las listas y data.frames-data.tables por referencia.

Probado con data.table v1.9.6.

Cuestiones relacionadas