varias superponer studio lineas graficos graficas r count aggregate-functions

studio - superponer graficas en r



Agregando en R (2)

Tengo un marco de datos con dos columnas. Quiero agregar dos columnas adicionales al conjunto de datos con recuentos basados ​​en agregados.

df <- structure(list(ID = c(1045937900, 1045937900), SMS.Type = c("DF1", "WCB14"), SMS.Date = c("12/02/2015 19:51", "13/02/2015 08:38"), Reply.Date = c("", "13/02/2015 09:52") ), row.names = 4286:4287, class = "data.frame")

Quiero simplemente contar el número de Instancias de SMS.Type y Reply.Date donde no hay nulo. Entonces, en el siguiente ejemplo de juguete, generaré 2 para SMS.Type y 1 para Reply.Date

Luego quiero agregar esto al marco de datos como recuentos totales (estoy consciente de que duplicarán el número de filas en el conjunto de datos original, pero eso está bien)

He estado jugando con la función de agregado y recuento pero fue en vano

mytempdf <-aggregate(cbind(testtrain$SMS.Type,testtrain$Response.option)~testtrain$ID, train, function(x) length(unique(which(!is.na(x))))) mytempdf <- aggregate(testtrain$Reply.Date~testtrain$ID, testtrain, function(x) length(which(!is.na(x))))

¿Alguien puede ayudar?

Gracias por tu tiempo


Después de convertir sus cadenas vacías a NA:

library(dplyr) mutate(df, SMS.Type.count = sum(!is.na(SMS.Type)), Reply.Date.count = sum(!is.na(Reply.Date)))


Usando data.table podría hacerlo (he agregado una NA real a sus datos originales). Tampoco estoy seguro si realmente buscas length(unique()) o solo length ?

library(data.table) cols <- c("SMS.Type", "Reply.Date") setDT(df)[, paste0(cols, ".count") := lapply(.SD, function(x) length(unique(na.omit(x)))), .SDcols = cols, by = ID] # ID SMS.Type SMS.Date Reply.Date SMS.Type.count Reply.Date.count # 1: 1045937900 DF1 12/02/2015 19:51 NA 2 1 # 2: 1045937900 WCB14 13/02/2015 08:38 13/02/2015 09:52 2 1

En la versión de desarrollo (v> = 1.9.5) también podría usar la función uniqueN

Explicación

Esta es una solución general que funcionará en cualquier cantidad de columnas deseadas. Todo lo que necesita hacer es poner los nombres de las columnas en cols .

  1. lapply(.SD, está llamando a cierta función sobre las columnas especificadas en .SDcols = cols
  2. paste0(cols, ".count") crea nuevos nombres de columna al agregar la count a los nombres de columna especificados en cols
  3. := realiza la asignación por referencia , es decir, actualiza las columnas recién creadas con el resultado de lapply(.SD, in place)
  4. by argumento es especificar las columnas del agregador