gpt4 book ai didi

R:使用 dplyr 计算提前 1 小时的出现次数

转载 作者:行者123 更新时间:2023-12-03 17:04:29 26 4
gpt4 key购买 nike

试图找出一种方法来使用 dplyr 来计算每个 id 在每个时间提前 1 小时的出现次数。尝试使用 for 循环,但它没有给我想要的结果。遍历堆栈并尝试寻找各种方法但无济于事。非常感谢任何建议或帮助。谢谢

数据集:
https://drive.google.com/file/d/1U186SeBWYyTnJVgUPmow7yknr6K9vu8i/view?usp=sharing

  id           date_time count
1 1 2019-12-27 00:00:00 NA
2 2 2019-12-27 00:00:00 NA
3 2 2019-12-27 00:55:00 NA
4 2 2019-12-27 01:00:00 NA
5 2 2019-12-28 01:00:00 NA
6 3 2019-12-27 22:00:00 NA
7 3 2019-12-27 22:31:00 NA
8 3 2019-12-28 14:32:00 NA

期望输出
  id           date_time count
1 1 2019-12-27 00:00:00 1 #Count = 1 since there is no other cases 1 hour ahead but itself, only 1 case of id=1
2 2 2019-12-27 00:00:00 3 #Count = 3 as there are 3 cases from 00:00 to 01:00 on 27/12
3 2 2019-12-27 00:55:00 2 #Count = 2 as there are 2 cases from 00:55 to 01:55 on 27/12
4 2 2019-12-27 01:00:00 1 #Count = 1 as only itself from 01:00 to 02:00 on 27/12
5 2 2019-12-28 01:00:00 1 #Count = 1 as only itself from 01:00 to 02:00 on 28/12
6 3 2019-12-27 22:00:00 2
7 3 2019-12-27 22:31:00 1
8 3 2019-12-28 14:32:00 1

我的代码(我被卡住了):
library(tidyverse)

data <- read.csv('test.csv')
data$date_time <- as.POSIXct(data$date_time)
data$count <- NA

data %>%
group_by(id) %>%
arrange(date_time, .by_group=TRUE)

#Doesn't give the desired output
for (i in 1:nrow(data)){
data$count[i] <- nrow(data[data$date_time<=data$date_time[i]+1*60*60 & data$date_time>=data$date_time[i],])
}

最佳答案

如果 OP 只是在寻找 tidyverse解决方案。我很高兴删除它。

这是一种使用 data.table 的方法非平等加入:

DT[, onehrlater := date_time + 60*60] 
DT[, count :=
DT[DT, on=.(id, date_time>=date_time, date_time<=onehrlater),
by=.EACHI, .N]$N
]

如何阅读:

1) DT[, onehrlater := date_time + 60*60]创建一小时后的 POSIX 日期时间的新列。 :=通过引用更新原始数据集。

2) DT[DT, on=.(id, date_time>=date_time, date_time<=onehrlater)执行自非对等连接,这样所有具有 i) 相同 id 的行,ii) 在该行的 date_time 之后的 date_time 和 iii) 在该行的 date_time 一小时后的 date_time 之前的所有行都连接到该行。

3) by=.EACHI, .N返回每一行的计数。和 $N访问此 self non-equi join 的输出。和 DT[, count := ...]通过引用更新原始数据集。

输出:
   id           date_time          onehrlater count
1: 1 2019-12-27 00:00:00 2019-12-27 01:00:00 1
2: 2 2019-12-27 00:00:00 2019-12-27 01:00:00 3
3: 2 2019-12-27 00:55:00 2019-12-27 01:55:00 2
4: 2 2019-12-27 01:00:00 2019-12-27 02:00:00 1
5: 2 2019-12-28 01:00:00 2019-12-28 02:00:00 1
6: 3 2019-12-27 22:00:00 2019-12-27 23:00:00 2
7: 3 2019-12-27 22:31:00 2019-12-27 23:31:00 1
8: 3 2019-12-28 14:32:00 2019-12-28 15:32:00 1

数据:
library(data.table)
DT <- fread("id date_time
1 2019-12-27T00:00:00
2 2019-12-27T00:00:00
2 2019-12-27T00:55:00
2 2019-12-27T01:00:00
2 2019-12-28T01:00:00
3 2019-12-27T22:00:00
3 2019-12-27T22:31:00
3 2019-12-28T14:32:00")
DT[, date_time := as.POSIXct(date_time, format="%Y-%m-%dT%T")]

关于R:使用 dplyr 计算提前 1 小时的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62363292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com