2016-03-12 2 views
-1

У меня есть фрейм данных с буксирными colomns:Как вычислить средний интервал будильника?

A  B 
    1  5 
    2  4 
    1  3 
    2  2 
    3  5 

Что мне нужно рассчитать среднее для всех значений в B для некоторого класса от А : , например, рассчитать средний для всех значений из B (которые соответствуют только между 0 и 2 от А) и то же для 2-4 , поэтому мой класс от A 0-2 2-4 4-6

любая идея?

+0

Вы можете использовать 'cut' для создания переменной группировки, а затем получить' mean' of 'B' – akrun

+0

Не могли бы вы показать, как PLS и я также хочу построить среднее значение с классами? – temor

+0

В показанном примере A не имеет значения, которое падает между 4-6. Что вы хотите заполнить для «mean» of «B» для этих случаев? – akrun

ответ

-1

Функция tapply - это то, что вам нужно. tapply(df$B, df$A, mean) должен сделать трюк. Есть более эффективные способы сделать это для больших данных. Также посмотрите на group_by и суммируйте в dplyr.

1

Это зависит от того, насколько ваши интервалы включены или нет (это вторая строка, включенная как в интервал 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]])}) 
Смежные вопросы