Одним из способов является использование cut()
для создания коэффициента из переменной x
, определяющего разрывы каждые десять единиц. Учитывая этот фактор, вы можете затем использовать by()
или aggregate()
или ... для суммирования фрейма данных, или, скорее, просто столбец y
:
R> set.seed(42); DF <- data.frame(x=runif(50,1,100), y=rnorm(50,30,70))
R> summary(DF)
x y
Min. : 1.39 Min. :-179.5
1st Qu.:40.66 1st Qu.: -19.4
Median :64.45 Median : 39.6
Mean :60.29 Mean : 25.9
3rd Qu.:90.10 3rd Qu.: 74.7
Max. :98.90 Max. : 140.3
R> DF$cx <- cut(DF$x, breaks=seq(0,100,by=10))
R> ?by
R> by(DF, DF$cx, FUN=function(z) mean(z$y))
DF$cx: (0,10]
[1] 67.8747
---------------------------------------------
DF$cx: (10,20]
[1] 52.9104
---------------------------------------------
DF$cx: (20,30]
[1] -53.8961
---------------------------------------------
DF$cx: (30,40]
[1] 44.1992
---------------------------------------------
DF$cx: (40,50]
[1] 21.7404
---------------------------------------------
DF$cx: (50,60]
[1] 16.2122
---------------------------------------------
DF$cx: (60,70]
[1] -27.0338
---------------------------------------------
DF$cx: (70,80]
[1] 42.283
---------------------------------------------
DF$cx: (80,90]
[1] 40.8042
---------------------------------------------
DF$cx: (90,100]
[1] 38.8917
R>
Или используя ddply()
:
R> library(plyr)
R> ddply(DF, .(cx), function(z) mean(z$y))
cx V1
1 (0,10] 67.8747
2 (10,20] 52.9104
3 (20,30] -53.8961
4 (30,40] 44.1992
5 (40,50] 21.7404
6 (50,60] 16.2122
7 (60,70] -27.0338
8 (70,80] 42.2830
9 (80,90] 40.8042
10 (90,100] 38.8917
R>