我有一个数据框(〜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)
...
答案 0 :(得分:1)
如果您的time
与POSIXct
类似,则可以完成以下艰苦的工作:
with(mydata, tapply(value, cut(time, "mins"), median))
请参见?cut.POSIXt
答案 1 :(得分:0)
我做了一个可重复的例子...
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)。
答案 2 :(得分:0)
我该如何编程循环,以便一个接一个地计算所有八个表?
代码:
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
非常感谢您的帮助!