【问题标题】:How to calculate the median for each minute of a dataframe?如何计算数据帧每分钟的中位数?
【发布时间】:2019-10-12 09:36:07
【问题描述】:

我有一个数据框(约 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)
...

【问题讨论】:

  • 对于上述给定数据,您期望的输出是什么?

标签: r statistics data.table median


【解决方案1】:

如果您的 time 类似于 POSIXct,那么以下是正确的工作:

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

?cut.POSIXt

【讨论】:

  • 抱歉,我需要一点帮助..."mins" 是什么?
  • "mins" 是分钟。见?cut.POSIXt :)
【解决方案2】:

我做了一个可重现的例子......

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)。

【讨论】:

  • 谢谢!!
【解决方案3】:

如何编写一个循环,以便依次计算所有八个表?

代码:

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

非常感谢您的帮助!

【讨论】:

  • 如果所有不同的对象都有不同的时间跨度——因此它们的日期和时间事件不会交叉——你可以为每个对象创建一个 data.table 并通过rbindlist(list(M1_I,M2_I,M3_I,M4_I,M1_U,M2_U,M3_U,M4_U)) 将它们绑定在一起然后从您的代码中运行第 3-6 行并一起执行。
猜你喜欢
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多