sumar - crear esquemas en excel
Agregue filas(recuento) que coincidan con una condición, agrupar por valores únicos (4)
Aquí hay otro enfoque:
a <- data.frame(id=1:10, contact=sample(c("peter", "sahrah"), 10, T), contactGrp=sample(c("west", "east"), 10, T), relpos=sample(0:1, 10, T), maxpos=runif(10, 0,10))
library(sqldf)
sqldf("Select contactGrp, count(*) as cnt from a where relpos=0 and maxpos > 1 Group by contactGrp")
contactGrp cnt
1 east 3
2 west 1
Parece un problema tan simple, pero me he estado arrancando el pelo tratando de hacer que esto funcione:
Dado este marco de datos que identifica las interacciones que el id
tuvo con el contact
que está agrupado por contactGrp
,
head(data)
id sesTs contact contactGrp relpos maxpos
1 6849 2012-06-25 15:58:34 peter west 0.000000 3
2 6849 2012-06-25 18:24:49 sarah south 0.500000 3
3 6849 2012-06-27 00:13:30 sarah south 1.000000 3
4 1235 2012-06-29 17:49:35 peter west 0.000000 2
5 1235 2012-06-29 23:56:35 peter west 1.000000 2
6 5893 2012-06-30 22:21:33 carl east 0.000000 1
¿Cuántos contactos hay para unique(data$contactGrp)
con relpos=1
y maxpos>1
?
Un resultado esperado sería:
1 west 1
2 south 1
3 east 0
Un pequeño subconjunto de líneas que he intentado:
-
aggregate(data, by=list(''contactGrp''), FUN=count)
produce un error, sin filtrado - El uso de
data.table
parece requerir una clave, que no es única en estos datos ... -
ddply(data,"contactGrp",summarise,count=???)
no está seguro de qué función usar para completar la columna decount
-
ddply(subset(data,maxpos>1 & relpos==0), c(''contactGrp''), function(df)count(df$relpos))
funciona pero me da una columna extrax
y se siente como si hubiera complicado demasiado eso…
SQL sería fácil: Select contactGrp, count(*) as cnt from data where … Group by contactGrp
pero estoy intentando aprender R
Creo que esta es la versión ddply
que estás buscando:
ddply(sessions,.(contactGrp),
summarise,
count = length(contact[relpos == 0 & maxpos > 1]))
Su primer intento de línea con agregado no funciona porque no hay un count
funciones. Te refieres a la length
. Todo lo que tenía que hacer era ejecutar eso con la selección de datos condicionales para relpos y maxpos, y también seleccionar una variable ficticia para obtener el recuento de (no importa cuál). Sin embargo, en lugar de usar comandos de agregación flexibles de varios tipos, el comando de table
integrado está diseñado solo para esto.
with( data[data$relpos == 1 & data$maxpos > 1,], table(contactGrp) )
Y aquí está la solución data.table
:
> library(data.table)
> dt <- data.table(sessions)
> dt[, length(contact[relpos == 0 & maxpos > 1]), by = contactGrp]
contactGrp V1
[1,] west 2
[2,] south 0
[3,] east 0
> dt[, length(contact[relpos == 1 & maxpos > 1]), by = contactGrp]
contactGrp V1
[1,] west 1
[2,] south 1
[3,] east 0