[英]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.