bin / group числовые векторы разной длины

У меня есть числовые векторы с разной длиной, от 300 до 500. Я хотел бы «нормализовать» их до длины 100, то есть для вектора длиной 300 я беру среднее значение 3 значений, для вектора длиной 500 среднее из 5 значений и так далее.

Как я могу объединить числовые векторы и вычислить среднее значение без изменения порядка? Я пока не добился успеха с cut.

# numeric vectors of different lengths
v1 = rnorm(300)
v2 = rnorm(500)

# goal: numeric vectors of same length
v1.binned = c(mean(v1[1],v1[2],v1[3]), ...)
v2.binned = c(mean(v2[1],v2[2],v2[3], v2[4], v2[5]), ...)

person Martin Preusse    schedule 15.05.2013    source источник
comment
Если все ваши векторы не имеют длину N * 100, вы будете вычислять средневзвешенное значение. Например. v3=rnorm(250) - если вы вычисляете средние значения 1: 100, 101: 200 и 201: 250, третья группа получает вдвое больший вес, чем другие, когда вы делаете что-либо с тремя рассчитанными средними.   -  person Carl Witthoft    schedule 15.05.2013


Ответы (1)


Вы можете преобразовать векторы в matrix и использовать colMeans:

colMeans(matrix(v1,100))
[1] -0.09583398  0.01330998  0.11107002
colMeans(matrix(v2,100))
[1] -0.02396420  0.08638535 -0.03953273  0.09861287  0.01112838

Однако будьте осторожны с переработкой, если размер разреза не является точным кратным размеру вектора. В этом случае стратегия _4 _-_ 5_ сработает:

sapply(split(v1,(seq_along(v1)-1)%/%200),mean)
        0         1 
-0.041262  0.111070 
person James    schedule 15.05.2013
comment
Векторы не являются точными кратными размеру разреза. Решение 2 очень помогает. Я думаю, мне нужно изменить% /% 200 на что-то вроде% /% (length (v1) / 100), чтобы получить среднее значение для 100 групп независимо от длины вектора. - person Martin Preusse; 15.05.2013