2012-07-20 8 views
18

Parece un problema tan simple, pero he estado tomando el pelo a cabo tratando de conseguir que esto funcione:agregada (recuento) filas que cumplan una condición, por grupo de valores únicos

Dada esta trama de datos de identificación las interacciones id tenían con contact que se agrupa 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 donde 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 las líneas que he intentado:

  • aggregate(data, by=list('contactGrp'), FUN=count) produce un error, sin filtrado
  • usando data.table parece requerir una clave, que no es exclusivo en estos datos ...
  • ddply(data,"contactGrp",summarise,count=???) no estoy seguro de qué función usar para llenar el count columna
  • ddply(subset(data,maxpos>1 & relpos==0), c('contactGrp'), function(df)count(df$relpos)) obras, pero me da una columna adicional x y se siente como si hubiera excesivamente complicada que ...

SQL sería fácil: Select contactGrp, count(*) as cnt from data where … Group by contactGrp pero estoy tratando de aprender R

+0

Creo que significó 'west 2, east 0, south 0' para obtener los resultados esperados. – joran

+0

realmente relpos = 1. Pero sí para relpos = 0 el resultado esperado está en la lista incorrecta ... –

+0

Gah! Tienes razón, lo siento. Es temprano en la mañana donde estoy. :) – joran

Respuesta

19

creo que esto es ddply la versión que estás buscando:

ddply(sessions,.(contactGrp), 
     summarise, 
     count = length(contact[relpos == 0 & maxpos > 1])) 
+0

Gracias. Parte de esa sintaxis me parece un poco oscura: la notación de columna.(), Pudiendo referirse a _columnName_ [condition] como un parámetro para la función de longitud. Supongo que tengo algo que leer ... –

+0

@LukasGrebe Lo siento, la notación '.()' Es un hábito mío, pero no es estrictamente necesario. También puede especificar las variables de agrupación con algo como 'c (" contactGrp ")'. – joran

+0

no hay problema. aprendí algo :) –

10

Aquí es 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 
22

Y aquí es 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 
10

Su primer intento de línea con el agregado no funciona porque no hay ninguna función count. Querías decir 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 conteo de (no importa cuál). Sin embargo, en lugar de utilizar comandos flexibles de agregación de varios tipos, el comando integrado table está diseñado solo para esto.

with(data[data$relpos == 1 & data$maxpos > 1,], table(contactGrp)) 
Cuestiones relacionadas