Ответ 1
Я думаю, что это версия ddply
, которую вы ищете:
ddply(sessions,.(contactGrp),
summarise,
count = length(contact[relpos == 0 & maxpos > 1]))
Кажется, такая простая проблема, но я вытягиваю свои волосы, пытаясь заставить это работать:
Учитывая этот фрейм данных, идентифицирующий взаимодействия 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
Я думаю, что это версия ddply
, которую вы ищете:
ddply(sessions,.(contactGrp),
summarise,
count = length(contact[relpos == 0 & maxpos > 1]))
И вот решение 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
Вот еще один подход:
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
Ваша первая попытка строки с агрегатом не работает, потому что нет функции count
. Вы имели в виду length
. Все, что вам нужно было сделать, это выполнить с условным выбором данных для relpos и maxpos, а также выбрать фиктивную переменную, чтобы получить счетчик (неважно, какой из них). Тем не менее, вместо использования гибких команд агрегации различных типов, встроенная команда table
предназначена именно для этого.
with( data[data$relpos == 1 & data$maxpos > 1,], table(contactGrp) )