2012-10-11 12 views
21

Duplicar posible:
This R reshaping should be simple, but¿Se puede utilizarcast sin una función de agregado?

dcast de reshape2 obras sin una fórmula en la que no hay duplicados. Tome estos datos de ejemplo:

df <- structure(list(id = c("A", "B", "C", "A", "B", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 224L, 
225L, 2206L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-6L)) 

me gustaría dcast estos datos y sólo tienen los valores tabulados, sin aplicar ningún tipo de función a la value.var incluyendo el valor por defecto length.

En este caso, funciona bien.

> dcast(df, id~cat, value.var="val") 
    id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 2206 

Pero cuando hay variables duplicados, los fun por defecto length. ¿Hay alguna forma de evitarlo?

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L)) 

> dcast(df2, id~cat, value.var="val") 
Aggregation function missing: defaulting to length 
    id SS SV 
1 A 1 1 
2 B 1 1 
3 C 1 2 

Lo ideal sería que lo que estoy buscando es añadir un fun = NA, como en no tratar de agregar el value.var. El resultado me gustaría cuando dcasting gl2:

id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 220 
4. C NA 1 
+0

¿Qué le gustaría que hay que hacer cuando existe una duplicación? – Dason

+0

Simplemente agregue eso en otra fila con 'NA' para cualquier valor perdido. – Maiasaura

+0

@Dason ¿Es kosher responder mi propia pregunta ahora que encontré una solución? ¿O debería simplemente eliminar el q? – Maiasaura

Respuesta

19

No creo que hay una manera de hacerlo directamente, pero podemos añadir en una columna adicional que nos ayudará a cabo

df2 <- structure(list(id = c("A", "B", "C", "A", "B", "C", "C"), cat = c("SS", 
"SS", "SS", "SV", "SV", "SV", "SV"), val = c(220L, 222L, 223L, 
224L, 225L, 220L, 1L)), .Names = c("id", "cat", "val"), class = "data.frame", row.names = c(NA, 
-7L)) 

library(reshape2) 
library(plyr) 
# Add a variable for how many times the id*cat combination has occured 
tmp <- ddply(df2, .(id, cat), transform, newid = paste(id, seq_along(cat))) 
# Aggregate using this newid and toss in the id so we don't lose it 
out <- dcast(tmp, id + newid ~ cat, value.var = "val") 
# Remove newid if we want 
out <- out[,-which(colnames(out) == "newid")] 
> out 
# id SS SV 
#1 A 220 224 
#2 B 222 225 
#3 C 223 220 
#4 C NA 1 
+0

Gracias, llegué a la misma conclusión. – Maiasaura

9

Descubrí la misma solución mientras Dason respondía la mía.

Me di cuenta de que dcast simplemente no sabe cómo tratar con duplicados. La forma en que descubrí cómo engañarlo fue agregando otro identificador único para que no se confunda con los duplicados.

En este ejemplo:

df <- ddply(df2, .(cat), function(x){ x$id2 = 1:nrow(x); x}) 
> dcast(df, id+id2~cat, value.var="val")[,-2] 
    id SS SV 
1 A 220 224 
2 B 222 225 
3 C 223 220 
4 C NA 1 
+0

que fue tan útil para un caso similar para mí. Gracias :) – sarah

+0

¡Me salvaste el día! –

Cuestiones relacionadas