tablas studio programacion pivotar funciones funcion for ejemplos dcast datos r reshape2

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