Это зависит от того, насколько ваши интервалы включены или нет (это вторая строка, включенная как в интервал 0-2, так и в интервал 2-4 или только один из них).
Если интервалы не закрыты (интервалы по крайней мере полуоткрыты) и смежные, @akrun дал наилучший подход в комментарии, используя функцию cut
, чтобы создать новый фактор группировки как cut(df$A, breaks=2*(0:3))
, а затем, используя наклейку для применения среднее значение основано на этом, используя tapply(df$B,cut(df$A, breaks=2*0:3,FUN=mean)
. Такой подход не будет обрабатывать случаи, когда вам понадобятся закрытые интервалы, или точки могут падать через несколько интервалов. Он также не даст вам значения интервалов, в которые не выпадет ни одна точка (что может быть или не желательно). Интервалы также должны быть смежными.
Следующий подход допускает произвольные интервалы и по умолчанию идентифицирует интервалы, в которых нет точек падения. Точкам разрешено падать более чем на один интервал.
df<-data.frame(A=c(1,2,1,2,3),B=c(5,4,3,2,5))
cuts<-matrix(c(0,2,2,4,4,6),ncol=2,byrow=TRUE)
Здесь порезы матрица будет содержать границы фактический интервал:
[,1] [,2]
[1,] 0 2
[2,] 2 4
[3,] 4 6
Теперь функцию, которая выбирает элементы в интервале †
cls<-function(vals,cat) {(vals>=cat[1]&vals<=cat[2])}
написать Здесь cls ожидает получить вектор значений и вектор, дающий верхнюю и нижнюю границы интервала. Он возвращает логический вектор, указывающий, находится ли значение в интервале или нет. Например, cls(df$A,c(0,2))
производит
[1] TRUE TRUE TRUE TRUE FALSE
говорит нам, что все, кроме последнего значения A находится в интервале от 0 до 2.
Наконец, мы можем найти среднее из значений B для каждого интервала, как это так, ‡
apply(cuts,1,function(x){mean(df$B[cls(df$A,x)])})
Это обрабатывает каждую строку в сокращений матрицу (1 в качестве второго варианта означает по строкам) и вычисляет среднее значение B, соответствующее значениям A в интервале, указанном этой строкой (df$B[cls(df$A,x)]
использует нашу функцию cls, чтобы найти значения A в интервале, заданном x, а затем выбирает значение B s соответствует этому - те, где возвращаемое значение равно TRUE).
В результате
[1] 3.500000 3.666667 NaN
Это говорит нам среднее из значений B, соответствующего значение от 0 до 2 составляет 3,5, среднее из значений B, соответствующих значениям от 2 до 4 3 и 2/3, и нет значений B, соответствующих значениям A от 4 до 6 (поскольку таких значений A нет).
† Если полуоткрытый желательно, легко модифицировать для CLS, например. Если мы хотим, чтобы исключить правую границу, мы можем использовать
cls<-function(vals,cat) {(vals>=cat[1]&vals<cat[2])}
, и если мы хотим, чтобы исключить нижнюю границу, мы можем использовать
cls<-function(vals,cat) {(vals>cat[1]&vals<=cat[2])}
или с использованием строго открытых интервалов, мы можем сделать
cls<-function(vals,cat) {(vals>cat[1]&vals<cat[2])}
Однако в этих случаях использование функции cut
может быть лучше.
‡ Если вы не хотите, чтобы создать функцию CLS, весь выбор может быть в подкладке, как
apply(cuts,1,function(x){mean(df$B[df$A>=x[1]&df$A<=x[2]])})
или, устраняя необходимость в разрезы также переменные,
apply(matrix(c(0,2,2,4,4,6),ncol=2,byrow=TRUE),1,function(x){mean(df$B[df$A>=x[1]&df$A<=x[2]])})
Вы можете использовать 'cut' для создания переменной группировки, а затем получить' mean' of 'B' – akrun
Не могли бы вы показать, как PLS и я также хочу построить среднее значение с классами? – temor
В показанном примере A не имеет значения, которое падает между 4-6. Что вы хотите заполнить для «mean» of «B» для этих случаев? – akrun