LINUX.ORG.RU

Ring vectors в R

 


0

1

Есть вот такой вектор:

hours<-c(1.8, 0.29, 0.72, 1.24, 0.64, 0.76, 0.68, 0.89, 1.6, 1.04, 0.5, 
         2.22, 2.49, 1.03, 1.12, 1.9, 2.26, 1.91, 0.97, 0.79, 2.4, 1.72, 
         0.35, 0.38)

В нем я дергаю задние элементы:

((39*y[7])+(8*y[6])-(4*y[5])-(4*y[4])+(y[3])+(4*y[2])-(2*y[1]))/42)

Однако мне нужно посчитать первый элемент:

((39*y[1])+(8*y[0])-(4*y[-1])-(4*y[-2])+(y[-3])+(4*y[-4])-(2*y[-5]))/42)

или

((39*y[1])+(8*y[24])-(4*y[23])-(4*y[22])+(y[21])+(4*y[20])-(2*y[19]))/42)

Это реально сделать без условий?

hours2 <- rep(hours,2)
sum(hours2[seq(5L,-5L,-1L) + length(hours)] * constants) / 42
alternative <- sum(hours[seq(2,1,-1,-2) %% length(hours)] * constants) / 42

в alternative нужно ноль «вырезать»

anonymous
()
Ответ на: комментарий от anonymous

Идею я понял, а что под константами имелось в виду? Хотя я уже понял реализацию. rep(hours) :)

Спасибо.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 2)
Ответ на: комментарий от psv1967

сгладить надо было элементы вектора, но анонимус уже подсказал как.

hours2 <- c(hours[19:24], hours, hours[1:6])
offset = length(hours[19:24])

Так что нет, не бред.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

Опять какой то бредогенератор :(

твой offset это просто (24-19)+1 , нафига его считать через «вот так»?

первое это оригинальный вектор к которому какого то хуана приделано его же первые шесть элементов сзади и шесть последних элементов спереди...

какое «сглаживание» такая операция имеет в виду?

psv1967 ★★★★★
()
Ответ на: комментарий от steemandlinux

ЗЫ есть нормальная библиотека для статистики таких данных http://circstatinr.st-andrews.ac.uk/

Вот обзор в статье https://cran.r-project.org/web/packages/isocir/vignettes/isocir.pdf

мозг можно сломать над такими «вопросами»...

psv1967 ★★★★★
()
Последнее исправление: psv1967 (всего исправлений: 2)
Ответ на: комментарий от psv1967

Ну и поскольку я понял что за сглаживание желается, просто читаем

?filter

и находим вожделенный circular в нем как параметр.

Все в R (как всегда) «украдено до нас» :)

psv1967 ★★★★★
()
Ответ на: комментарий от anonymous

поправлюcь, alternative нужно 1-based сделать:

hours[(seq(index,index-k,-1) %% length(hours))+1]
будет медленнее двойного буфера, но «бесконечный»

Идею я понял, а что под константами имелось в виду?

ну в коде вопроса «зашифровано» умножение векторов, второй вектор имелся ввиду

anonymous
()
Ответ на: комментарий от psv1967

Так я видел, оно без индексов не работает.

вот полный код:

length(VTIME)
[1] 73499
CURRENTHOUR <- round(as.numeric(((VTIME)+2001)/10000),0)
CURRENTHOUR <- replace(CURRENTHOUR, CURRENTHOUR==0, 24)
 
for (i in seq(1, 24, by = 1)){
   CURRENTHOUR <- replace(CURRENTHOUR, CURRENTHOUR==i, hours[i])
}

as.date не использую, потому что мне нужен round и числовая обработка быстрее.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от psv1967
> CURRENTHOUR <- replace(CURRENTHOUR, CURRENTHOUR, hours)
Warning message:
In x[list] <- values :
  number of items to replace is not a multiple of replacement length

> CURRENTHOUR <- replace(CURRENTHOUR, CURRENTHOUR[hours], hours)
Warning message:
In x[list] <- values :
  number of items to replace is not a multiple of replacement length

У меня индекс вектора hours хранится в _значении_ CURRENTHOUR. А не индекс к индексу.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 2)
Ответ на: комментарий от steemandlinux

Это ровно то чего ты просил.

anonymous
()
Ответ на: комментарий от steemandlinux

тебя ждут еще более удивительные открытия :)

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.