Как рассчитать медиану для каждой минуты кадра данных? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть фрейм данных (~ 15.000 строк), например:

time                   value
01-01-2019 08:09:25    5,3
01-01-2019 08:09:26    5,5
01-01-2019 08:09:27    6,1
...
01-01-2019 08:09:58    5,1
01-01-2019 08:09:59    5,4
01-01-2019 08:10:00    6,5
01-01-2019 08:10:01    5,2
01-01-2019 08:10:02    6,2
01-01-2019 08:10:03    5,4
...

Кроме того, пропущено ~ 10 строк. Это означает, что иногда есть только 59 секунд за одну минуту. Я не знаю, играет ли это роль.

Я нашел это онлайн, но это не сработало:

library(lubridate)
dd[, c('Hour', 'Minute') := .(datastrom::hour(zeit), minute(zeit))
][, .(Avg = mean(strom)), .(Hour, Minute)]

Мне нужна медиана для каждой минуты. Было бы здорово, если бы кто-нибудь мне помог!

Ожидаемый результат:

time                   value
01-01-2019 08:09       5,4 (=median of all values between 08:09:00 and 08:09:59)
01-01-2019 08:10       5,8 (=median of all values between 08:10:00 and 08:10:59)
...

Ответы [ 3 ]

1 голос
/ 12 октября 2019

если ваш time похож на POSIXct, то может сработать следующее:

with(mydata, tapply(value, cut(time, "mins"), median))

См. ?cut.POSIXt

0 голосов
/ 12 октября 2019

Как мне запрограммировать цикл так, чтобы все восемь таблиц вычислялись одна за другой?

Код:

dt_M1_I <- M1_I
dt_M1_I <- data.table(dt_M1_I)
dt_M1_I[,I:=as.numeric(gsub(",",".",I))]
dt_M1_I[,day:=substr(t,1,10)]
dt_M1_I[,hour:=substr(t,12,16)]
dt_M1_I_median <- dt_M1_I[,list(median_I=median(I,na.rm = TRUE)),by=.(day,hour)]

Это должно быть рассчитано для:

M1_I
M2_I
M3_I
M4_I
M1_U
M2_U
M3_U
M4_U

Большое спасибо за помощь!

0 голосов
/ 12 октября 2019

Я сделал воспроизводимый пример ...

library(data.table)
dd <- read.table(text="time                   value
'01-01-2019 08:09:25'    5,3
'01-01-2019 08:09:26'    5,5
'01-01-2019 08:10:00'    6,5
'01-01-2019 08:10:01'    5,2
'01-01-2019 08:10:02'    6,2
'01-01-2019 08:10:03'    5,4", header =TRUE)#
dd <- data.table(dd)
dd[,value:=as.numeric(gsub(",",".",value))]
dd[,day:=substr(time,1,10)]
dd[,hour:=substr(time,12,16)]
## only listing the median
dd[,list(median_value=median(value,na.rm = TRUE)),by=.(day,hour)]
## or an new data table
dd_median <- dd[,list(median_value=median(value,na.rm = TRUE)),by=.(day,hour)]

Просто создайте data.table (dd) вашего фрейма данных.

...