Рассчитать центр соседних значений в массиве - PullRequest
1 голос
/ 26 мая 2011

Я создал массив значений:

binBorder=exp(0:5)
# 1.000000   2.718282   7.389056  20.085537  54.598150 148.413159

, который дает мне массив с длиной 6 в этом случае.Теперь я хочу создать второй массив, который содержит число, которое находится точно между этими двумя числами.Это должно дать массив размером пять в этом случае и содержать значения:

 1.000000 - ( 1.000000 -   2.718282) / 2
 2.718282 - ( 2.718282 -   7.389056) / 2
 7.389056 - ( 7.389056 -  20.085537) / 2
20.085537 - (20.085537 -  54.598150) / 2
54.598150 - (54.598150 - 148.413159) / 2

Есть ли встроенная функция для таких вещей?Мне это нужно для расчета центра бункера (это должно быть распространенной проблемой).Или следующий код является «самым простым решением»?

> bb1 = exp(0:4)
> bb2 = exp(1:5)
> bb = bb1 + ((bb2 - bb1) / 2)
> bb

Я новичок в R, поэтому я не уверен, как вообще решаются проблемы.Это больше встроенных функций или создание таких вещей, как решение, которое я составил?

Спасибо за вашу помощь,

Свен

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Ваше решение может быть переписано с использованием поднабора, чтобы избежать промежуточных переменных:

(binBorder[1:5]+binBorder[-1])/2
[1]   1.859141   5.053669  13.737297  37.341843 101.505655

На самом деле, в общем случае вы могли бы написать следующую функцию:

midPoints <- function(x){
  (x[-length(x)]+x[-1])/2
}
1 голос
/ 26 мая 2011

Разве это не легко обрабатывается diff ()?

binBorder <- exp(0:5)
binBorder[1:5] + diff(binBorder)/2
1 голос
/ 26 мая 2011

Функция filter делает то, что вы просите.При использовании следующим образом он рассчитывает двухпериодное скользящее среднее:

filter(binBorder, c(0.5, 0.5), sides=1)
Time Series:
Start = 1 
End = 6 
Frequency = 1 
[1]         NA   1.859141   5.053669  13.737297  37.341843 101.505655

Единственный (небольшой) недостаток фильтра состоит в том, что он возвращает значение класса ts (для временных рядов).

Вы можете избежать этого, позвонив по номеру convolve:

convolve(binBorder, c(0.5, 0.5), type="filter")
[1]   1.859141   5.053669  13.737297  37.341843 101.505655
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...