studio sheet separate español data cheat r count pivot reshape2 tidyr

sheet - Tidyr cómo propagarse en el recuento de la ocurrencia



tidyr cheat sheet (2)

Aquí hay otra opción usando dcast de data.table

library(data.table) dcast(setDT(other), name~result, length) # name N Y #1: a 0 2 #2: b 1 0 #3: c 0 1 #4: d 1 0

Aunque, table(other) sería una opción compacta (de los comentarios de @mtoto), para grandes conjuntos de datos, puede ser más eficiente usar dcast . Algunos puntos de referencia se dan a continuación

set.seed(24) other1 <- data.frame(name = sample(letters, 1e6, replace=TRUE), result = sample(c("Y", "N"), 1e6, replace=TRUE), stringsAsFactors=FALSE) other2 <- copy(other1) gopala1 <- function() other1 %>% group_by(name) %>% summarise(N = sum(result == ''N''), Y = sum(result == ''Y'')) gopala2 <- function() spread(as.data.frame(table(other1)), result, Freq) gopala3 <- function() spread(count(other1, name, result), result, n, fill = 0) akrun <- function() dcast(as.data.table(other2), name~result, length) library(microbenchmark) microbenchmark(gopala1(), gopala2(), gopala3(), akrun(), unit=''relative'', times = 20L) # expr min lq mean median uq max neval # gopala1() 2.710561 2.331915 2.142183 2.325167 2.134399 1.513725 20 # gopala2() 2.859464 2.564126 2.531130 2.683804 2.720833 1.982760 20 # gopala3() 2.345062 2.076400 1.953136 2.027599 1.882079 1.947759 20 # akrun() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 20

Tener un marco de datos como este

other=data.frame(name=c("a","b","a","c","d"),result=c("Y","N","Y","Y","N"))

¿Cómo puedo usar la función de extensión en tidyr u otra función para obtener el recuento del resultado Y o N como encabezado de columna como este?

name Y N a 2 0 b 0 1

Gracias


Estas son algunas formas de que muchos lo hagan:

1) Con la biblioteca dplyr , puede simplemente agrupar elementos y contar en el formato necesario:

library(dplyr) other %>% group_by(name) %>% summarise(N = sum(result == ''N''), Y = sum(result == ''Y'')) Source: local data frame [4 x 3] name N Y <fctr> <int> <int> 1 a 0 2 2 b 1 0 3 c 0 1 4 d 1 0

2) Puede usar una combinación de table y extensión de tidyr siguiente manera:

library(tidyr) spread(as.data.frame(table(other)), result, Freq) name N Y 1 a 0 2 2 b 1 0 3 c 0 1 4 d 1 0

3) Puede usar una combinación de dplyr y tidyr para hacer lo siguiente:

library(dplyr) library(tidyr) spread(count(other, name, result), result, n, fill = 0) Source: local data frame [4 x 3] Groups: name [4] name N Y <fctr> <dbl> <dbl> 1 a 0 2 2 b 1 0 3 c 0 1 4 d 1 0