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
.
-
lapply(.SD,
está llamando a cierta función sobre las columnas especificadas en.SDcols = cols
-
paste0(cols, ".count")
crea nuevos nombres de columna al agregar lacount
a los nombres de columna especificados encols
-
:=
realiza la asignación por referencia , es decir, actualiza las columnas recién creadas con el resultado delapply(.SD,
in place) -
by
argumento es especificar las columnas del agregador