studio - tablas de datos en r
¿Se puede usar dcast sin una función agregada? (2)
Posible duplicado:
Esta remodelación de R debe ser simple, pero
dcast
from reshape2
funciona sin una fórmula donde no hay duplicados. Toma 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 simplemente tabular los valores, sin aplicar ninguna función al value.var
incluida la length
predeterminada.
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 duplicadas, la fun
defecto es 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
Idealmente, lo que estoy buscando es agregar un fun = NA
, ya que no intente agregar el value.var
. El resultado que me gustaría cuando dcasting df2:
id SS SV
1 A 220 224
2 B 222 225
3 C 223 220
4. C NA 1
Descubrí la misma solución mientras Dason respondía a la mía.
Me di cuenta de que dcast
simplemente no sabe cómo tratar con los duplicados. La forma en que descubrí cómo engañarlo fue mediante la adición de 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
No creo que haya una forma de hacerlo directamente, pero podemos agregar una columna adicional que nos ayude
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