簡體   English   中英

時間序列分析函數r - 對象在范圍內的時間長度

[英]Time Series Analysis function in r - how long an object was in range

你知道r中的數據幀的時間序列分析函數:

dput(H)

structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 6986L, 6986L, 6986L, 6986L, 
6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 
6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 6986L, 
6986L, 6986L, 6986L, 627L, 627L, 627L, 627L, 627L, 627L, 627L, 
627L, 627L, 627L, 627L, 627L, 627L, 627L, 627L, 627L, 627L, 627L, 
627L, 627L, 627L, 627L, 627L, 6271L, 6271L, 6271L, 6271L, 6271L, 
6271L, 6271L, 6271L, 6271L, 6271L, 6271L, 6271L, 6271L, 6271L, 
6271L, 6271L, 6271L, 6271L, 6271L), value = c(134, 60, 63, 69, 
63, 66, 58, 63, 60, 65, 65, 48, 56, 50, 60, 60, 58, 60, 68, 58, 
60, 75, 64, 71, 73, 71, 67, 68, 66, 67, 63, 62, 68, 72, 74, 79, 
69, 76, 70, 72, 72, 60, 66, 67, 99, 107, 104, 106, 100, 91, 90, 
94, 95, 93, 108, 87, 93, 90, 100, 100, 104, 92, 102, 97, 93, 
84, 55, 86, 86, 80, 95, 98, 82, 85, 91, 83, 92, 86, 90, 93, 97, 
103, 94, 103, 99, 113), Time = structure(c(1273691520, 1273695180, 
1273698780, 1273702320, 1273705980, 1273709580, 1273713180, 1273716780, 
1273720380, 1273723980, 1273727580, 1273731180, 1273734780, 1273744080, 
1273745580, 1273749180, 1273752780, 1273756380, 1273759980, 1154541540, 
1154542260, 1154545860, 1154549460, 1154553060, 1154556000, 1154560260, 
1154563860, 1154567460, 1154571060, 1154574660, 1154578260, 1154581860, 
1154585460, 1154589060, 1154592660, 1154596260, 1154599860, 1154603460, 
1154607060, 1154610660, 1154614260, 1154617860, 1154621460, 1154625060, 
1189450860, 1189454520, 1189458060, 1189461660, 1189465260, 1189468860, 
1189472460, 1189476120, 1189479720, 1189483320, 1189486860, 1189490460, 
1189494060, 1189497720, 1189501260, 1189504860, 1189508520, 1189512120, 
1189515720, 1189519320, 1189522920, 1189526520, 1189530060, 1105998780, 
1105999440, 1106003040, 1106006700, 1106010060, 1106013840, 1106017440, 
1106021040, 1106024640, 1106028240, 1106031900, 1106035500, 1106039100, 
1106042700, 1106046300, 1106049900, 1106057100, 1106060700, 1106064300
), tzone = "UTC", class = c("POSIXct", "POSIXt"))), .Names = c("id", 
"value", "Time"), row.names = c(NA, -86L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000000000200788>)
> 

我的代碼:

setDT(h)[(value)>=55 & (value) <=85, Time[.N]- Time[1L], id] 

答復是:

     id         V1
1:    1 18.0 hours
2: 6986 23.2 hours
3:  627 59.0 hours
4: 6271  6.0 hours

要么:

setDT(h)[(value)> = 55&(value)<= 85,.N,id]

     id  N
1:    1 16
2: 6986 25
3:  627  2
4: 6271  4

但是對於id 1是16,並且對於id 627,其一個值為0,對於id 6986,其為23.2,對於id 6271,其為1.(對於每個id,時間序列是一天,因此它應該在0-24之間)。

問題是什么?

我們可以使用data.table

library(data.table)
setDT(list)[value>55 & value <85, .N, id]

或者如果它是'時間'的差異

setDT(list)[value>55 & value <85, Time[.N] - Time[1L], id]

基於OP帖子中更新的'p'數據集

p[value>55 & value < 85, Time[.N]- Time[1], by = id]
#     id         V1
#1: 6986 23.2 hours

更新

原因是'時間'差異小於一小時的'id',並且-它強制轉換為'小時'單位而不轉換價值。 一個選項是difftime並指定我們偏好的unit

setDT(h)[value>=55 & value <=85, difftime(Time[.N], Time[1L], unit = "hour"), id] 
#     id               V1
#1:    1 18.0000000 hours
#2: 6986 23.2000000 hours
#3:  627  0.9833333 hours
#4: 6271  6.0000000 hours

如果我們需要轉換為numeric ,請使用as.numeric包裝它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM