Условный Движущийся Макс - PullRequest
5 голосов
/ 19 августа 2011

Я относительный R noob.

У меня есть большой набор данных, который выглядит примерно так:

         Tempadjvolt      newmass     rgdeltas
2794       498.5777  0.5355647187   0.00000000
2795       499.7577  0.5355647187   0.00000000
2796       500.7877  0.3415104788  -2.87487763
2797       502.1177  0.4312854788  -1.54487763
2798       500.3877  0.5355647187   0.00000000
2799       502.5377  0.4596354788  -1.12487763
2800       507.6877  0.8072604788   4.02512237
2801       505.2577  0.6432354788   1.59512237
2802       505.7977  0.6796854788   2.13512237
2803       517.8877  1.4957604788  14.22512237
2804       502.2477  0.4400604788  -1.41487763
2805       507.3677  0.7856604788   3.70512237
2806       519.7277  1.6199604788  16.06512237
2807       528.9377  2.2416354788  25.27512237
2808       520.2677  1.6564104788  16.60512237
2809       519.3877  0.5355647187   0.00000000
2810       526.5677  2.0816604788  22.90512237
2811       519.5377  0.5355647187   0.00000000
2812       526.9277  2.1059604788  23.26512237
2813       529.9877  2.3125104788  26.32512237
2814       514.4077  1.2608604788  10.74512237
2815       518.3777  1.5288354788  14.71512237

Я пытаюсь определить отрицательные значения rgdeltas [например, строка 2804], а затем «посмотреть» 7позиции позади и впереди, чтобы найти самый высокий темпаджвольт и установить временный ряд строки 2804 на этот локальный макс.

Длина фрейма ~ 4000 строк, из которых ~ 515 являются отрицательными значениями.Я попробовал пару для петель, которые сорта работали ... но также выплевывали группу NA - что заставляет меня думать, что они были плохо / неправильно построены.

Любая помощь будет принята с благодарностью.

Как отмечалось в комментариях, исходное сообщение было неясным.Я не беспокоюсь о последовательных отрицательных значениях rgdeltas.Для отрицательных значений в пределах 7 от начала и конца кадра, в идеале цикл должен смотреть как можно больше позиций вперед и назад перед началом / концом.Менее обеспокоен этим на данный момент.

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

Я ценю помощь.Спасибо!

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

1) Нулевое заполнение . Предполагая, что фрейм данных называется DF, мы используем rollapply в пакете zoo для применения функции f к движущемуся окну шириной 15:

library(zoo)
# columns of DF are (1) Tempadjvolt, (2) newmass and (3) rgdeltas
f <- function(x) if (x[8, 3] < 0) max(x[, 1]) else x[8, 1]
DF[[1]] <- rollapply(DF, 15, f, fill = 0, by.column = FALSE)

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

2) Оставить конечные значения . Другая возможность состоит в том, чтобы обрабатывать только точки, не близкие к концам:

DF[seq(8, nrow(DF)-7), 1] <- rollapply(DF, 15, f, by.column = FALSE)

3) Частичные . или мы могли бы использовать partial = TRUE, а затем взять max частичных значений вблизи концов следующим образом:

f2 <- function(x) { 
      # Columns of DF2 are (1) Tempadjvolt, (2) newmass, (3) rgdeltas and (4) seq.
      # Condition is TRUE if passed a partial x near the beginning.
      # k is row index of current row in x. Normally 8 but near start it varies.
      k <- if (x[1, 4] == 1) nrow(x) - 7 else 8
      if (x[k,  3] < 0) max(x[, 1]) else x[k, 1]
}
DF2 <- cbind(DF, seq = 1:nrow(DF))
DF[[1]] <- rollapply(DF2, 15, f2, partial = TRUE, by.column = FALSE)
4 голосов
/ 19 августа 2011

Предположим, его зовут dat:

negidxs <- as.numeric( rownames(dat)[ dat[[3]] < 0 ] )
 for ( i in negidxs ){ 
      dat[as.character(i), "Tempadjvolt"] <- 
            max(dat[rownames(dat) %in% (i-7):(i+7), "Tempadjvolt"], na.rm=TRUE) }
 dat
  #----------------------------------#
     Tempadjvolt   newmass  rgdeltas
2794    498.5777 0.5355647  0.000000
2795    499.7577 0.5355647  0.000000
2796    517.8877 0.3415105 -2.874878
2797    517.8877 0.4312855 -1.544878
2798    500.3877 0.5355647  0.000000
2799    519.7277 0.4596355 -1.124878
2800    507.6877 0.8072605  4.025122
2801    505.2577 0.6432355  1.595122
2802    505.7977 0.6796855  2.135122
#snipped-----
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...