gpt4 book ai didi

r - 使用data.table按组计算和格式化行之间的时间差

转载 作者:行者123 更新时间:2023-12-01 13:11:19 24 4
gpt4 key购买 nike

我是 data.table“场景”的新手,所以如果我的问题过于简单,我深表歉意。我经常处于必须应用某些分析或对按唯一 ID 分组的某些数据进行子集化的位置。通常,每个唯一 ID 大约有 1,000 行,大约有 30 个唯一 ID。所以,我被建议切换到 data.table 而不是试图找出 lapply 或 sapply 或 plyr 包。

这是我的数据类型的示例

    structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), dt = structure(c(1138366975,
1138370472, 1138374064, 1138377669, 1138381264, 1138384873, 1138388503,
1138399312, 1138402842, 1138406507, 1138413700, 1138417261, 1138420848,
1138424444, 1138428071, 1138431695, 1138435287, 1138438938, 1138442428,
1138446098), class = c("POSIXct", "POSIXt"), tzone = "GMT")), .Names = c("ID",
"dt"), row.names = c(NA, -20L), class = "data.frame")

我把它转换成一个 data.table

X = data.table(test)

将我的“ key ”设置为个人

setkey(X,ID)

然后目标是以小时为单位计算时差(目前我希望这会很容易)。因此,要使用 Time2-Time1 来获取每个连续位置之间的小时和分钟数(在本例中为 ID)。

X[, diff:=c(NA,diff(dt)),by = ID]

此处的 diff 命令以分钟为单位进行计算,但我想以最有效的方式将其转换/四舍五入为小时,同时仍将该值保留为 POSIX 或时间对象。我知道我可能会创建另一个列并将 diff 除以 60。但我希望有一些方法可以只键入 "hours""minutes" 或其他内容某处。因为我不了解 data.table 如何处理时间。我尝试使用 difftime 命令在 data.frame 中使用 for 循环执行此操作,但它非常麻烦并将数据链接回原始数据数据框让我感到困惑,因为我不精通 for 循环。

将数据按小时计算后,我只想选择相隔 0.5 小时、相隔 4 小时和相隔 12 小时的数据。我还没有想出如何在 data.table 中做

最佳答案

这是一种方法,但可能不是最有效的...

X[ , diff := c( NA_character_ , difftime( tail( dt , -1 ) , head( dt , -1 ) , units = "hours" ) ) , by = ID ]
# ID V1
# 1: 1 NA
# 2: 1 0.971388888888889
# 3: 1 0.997777777777778
# 4: 1 1.00138888888889
# 5: 2 NA

关于r - 使用data.table按组计算和格式化行之间的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544422/

24 4 0