среднее значение некоторых значений в столбце до достижения 0 и сброса - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу получить среднее значение некоторых значений по столбцу следующим образом: Вычисляя среднее значение тех значений, где нет 0, затем при нахождении 0 сбрасывают и получают среднее значение следующих значений, пока снова не найдут 0, и так далее. Мои данные выглядят так:

      len    value
        0   0.0000
        0   0.0000
        1 307.4463
        2 308.0341
        0   0.0000
        0   0.0000
        0   0.0000
        1 305.7210
        0   0.0000

Вот образец:

      dput(sdat)
      structure(list(len = c(0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0), value = c(0, 
      0, 0, 0, 307.446310279931, 308.034096297716, 0, 0, 0, 0, 0, 0, 
      0, 0, 0, 0, 305.720985439491, 0, 0, 0, 0, 0, 0, 308.599408144233, 
      308.511240241565, 305.843728990264, 0, 0, 0, 0, 0)), .Names = c("len", 
      "value"), row.names = 250:280, class = "data.frame")

Итак, я хочу получить еще один столбец со средним значением над значением. Например. среднее значение (307,4463,308.0341), затем 305,72 .. и т. д.

Моя первая попытка использовать ave:

   sdat$mv <- ave( sdat[,"value"], (sdat[,"value"])==0, 
               FUN=function(x) mean(x,na.rm=T))

Итак, я бы хотел получить вывод:

          len    value  mv 
           0    0.0000  0   
           0    0.0000  0
           1  307.4463  0
           2  308.0341  307.7402   # mean of the previous 2-values 
           0    0.0000  0          
           0    0.0000  0
           0    0.0000  0 
           1  305.7210  3015.7210
            ...................

Но это не работает должным образом .. Я получаю неправильные значения ... и, если возможно, я бы получил в результирующем столбце только одно значение со средним значением (в конечной позиции перед следующими 0), а остальные с 0 или NA должно быть в порядке.

Есть идеи / предложения?

Большое спасибо,

1 Ответ

0 голосов
/ 12 ноября 2018

Вы получаете неверные результаты, потому что переменная группировки не имеет разных значений для каждого сегмента от нуля до нуля и т. Д.
Трюк cumsum даст хорошую переменную группировки.

f <- c(0L, cumsum(abs(diff(sdat$value != 0))))
ave(sdat$value, f, FUN = mean, na.rm = TRUE)

res <- cbind(sdat, Mean = ave(sdat$value, f, FUN = mean, na.rm = TRUE))
head(res, 10)
#    len    value     Mean
#250   0   0.0000   0.0000
#251   0   0.0000   0.0000
#252   0   0.0000   0.0000
#253   0   0.0000   0.0000
#254   1 307.4463 307.7402
#255   2 308.0341 307.7402
#256   0   0.0000   0.0000
#257   0   0.0000   0.0000
#258   0   0.0000   0.0000
#259   0   0.0000   0.0000

Окончательная очистка.

rm(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...