Подтвердить что ты не робот

Совокупные (подсчетные) строки, соответствующие условию, группа по уникальным значениям

Кажется, такая простая проблема, но я вытягиваю свои волосы, пытаясь заставить это работать:

Учитывая этот фрейм данных, идентифицирующий взаимодействия id с contact, который сгруппирован по 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

сколько контактов, где есть unique(data$contactGrp) с relpos=1 и maxpos>1?

Ожидаемый результат:

1 west   1
2 south  1
3 east   0

Небольшое подмножество строк я попыталось:

  • aggregate(data, by=list('contactGrp'), FUN=count) дает ошибку, фильтрацию
  • Использование data.table похоже, требует ключа, который не является уникальным в этих данных...
  • ddply(data,"contactGrp",summarise,count=???) не уверен, какую функцию использовать для заполнения столбца count
  • ddply(subset(data,maxpos>1 & relpos==0), c('contactGrp'), function(df)count(df$relpos)) работает, но дает мне дополнительный столбец x, и мне кажется, что я слишком усложнил его...

SQL было бы легко: Select contactGrp, count(*) as cnt from data where … Group by contactGrp но я пытаюсь узнать R

4b9b3361

Ответ 1

Я думаю, что это версия ddply, которую вы ищете:

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

Ответ 2

И вот решение 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

Ответ 3

Вот еще один подход:

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

Ответ 4

Ваша первая попытка строки с агрегатом не работает, потому что нет функции count. Вы имели в виду length. Все, что вам нужно было сделать, это выполнить с условным выбором данных для relpos и maxpos, а также выбрать фиктивную переменную, чтобы получить счетчик (неважно, какой из них). Тем не менее, вместо использования гибких команд агрегации различных типов, встроенная команда table предназначена именно для этого.

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