titulo - r grafica
Convertir un objeto "by" en un marco de datos en R (5)
Considere usar ddply en el paquete plyr en lugar de hacerlo por. Maneja el trabajo de agregar la columna a su marco de datos.
Estoy usando la función "by" en R para cortar un cuadro de datos y aplicar una función a diferentes partes, como esto:
pairwise.compare <- function(x) {
Nright <- ...
Nwrong <- ...
Ntied <- ...
return(c(Nright=Nright, Nwrong=Nwrong, Ntied=Ntied))
}
Z.by <- by(rankings, INDICES=list(rankings$Rater, rankings$Class), FUN=pairwise.compare)
El resultado (Z.by) se ve algo como esto:
: 4
: 357
Nright Nwrong Ntied
3 0 0
------------------------------------------------------------
: 8
: 357
NULL
------------------------------------------------------------
: 10
: 470
Nright Nwrong Ntied
3 4 1
------------------------------------------------------------
: 11
: 470
Nright Nwrong Ntied
12 4 1
Lo que me gustaría es que este resultado se convierta en un marco de datos (con las entradas NULL no presentes) para que se vea así:
Rater Class Nright Nwrong Ntied
1 4 357 3 0 0
2 10 470 3 4 1
3 11 470 12 4 1
¿Cómo puedo hacer eso?
Esto amplía la solución de Shane de usar rbind (), pero también agrega columnas que identifican grupos y elimina grupos NULOS, dos características que se solicitaron en la pregunta. Al usar las funciones del paquete base, no se requieren otras dependencias, por ejemplo, plyr.
simplify_by_output = function(by_output) {
null_ind = unlist(lapply(by_output, is.null)) # by() returns NULL for combinations of grouping variables for which there are no data. rbind() ignores those, so you have to keep track of them.
by_df = do.call(rbind, by_output) # Combine the results into a data frame.
return(cbind(expand.grid(dimnames(by_output))[!null_ind, ], by_df)) # Add columns identifying groups, discarding names of groups for which no data exist.
}
Hilo antiguo, pero para cualquiera que busque este tema:
analysis = by(...)
data.frame(t(vapply(analysis,unlist,unlist(analysis[[1]]))))
unlist()
tomará un elemento de una salida by()
(en este caso, analysis
) y lo expresará como un vector nombrado. vapply()
anula la lista de todos los elementos de analysis
y genera el resultado. Requiere un argumento ficticio para saber el tipo de salida, que es para lo que está disponible el analysis[[1]]
. Es posible que deba agregar una verificación de que el análisis no está vacío si eso es posible. Cada salida será una columna, por lo que t()
transpone a la orientación deseada donde cada entrada de análisis se convierte en una fila.
La función by
devuelve una lista, por lo que puede hacer algo como esto:
data.frame(do.call("rbind", by(x, column, mean)))
yo lo haría
x = by(data, list(data$x, data$y), function(d) whatever(d))
array(x, dim(x), dimnames(x))