Вы можете сделать это в несколько шагов, используя функциональность пакета plyr
.Это позволяет вам разбить ваши данные на нужные блоки, применить статистику к каждому блоку и объединить результаты.
Сначала я настроил несколько фиктивных данных:
set.seed(1)
n <- 100
dat <- data.frame(
date=sample(LETTERS[1:2], n, replace=TRUE),
station=sample(letters[1:2], n, replace=TRUE),
treatment=sample(0:1, n, replace=TRUE),
subject=paste("R", sample(1:2, n, replace=TRUE), sep=""),
par=runif(n, 0, 5)
)
head(dat)
date station treatment subject par
1 A b 0 R2 3.2943880
2 A a 0 R1 0.9253498
3 B a 1 R1 4.7718907
4 B b 0 R1 4.4892425
5 A b 0 R1 4.7184853
6 B a 1 R2 3.6184538
Теперь я используюфункция base называется cut
, чтобы разделить ваш номинал на лотки одинакового размера:
dat$bin <- cut(dat$par, breaks=10)
Теперь самое интересное.Загрузите пакет plyr
и используйте функцию ddply
для разделения, применения и объединения.Поскольку вам нужен подсчет частоты, мы можем использовать функцию length
, чтобы подсчитать, сколько раз каждая реплика появлялась в этой корзине:
library(plyr)
res <- ddply(dat, .(date, station, treatment, bin),
summarise, freq=length(treatment))
head(res)
date station treatment bin freq
1 A a 0 (0.00422,0.501] 1
2 A a 0 (0.501,0.998] 2
3 A a 0 (1.5,1.99] 4
4 A a 0 (1.99,2.49] 2
5 A a 0 (2.49,2.99] 2
6 A a 0 (2.99,3.48] 1