R语言 删除重复项,但根据小时差异保留

kokeuurv  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(136)

我想删除在同一天访问某个网站超过一次的重复客户,但保留访问间隔超过3小时的客户。例如,John在2022年12月24日应该只有一个观察,但Abbie在2022年12月18日应该有2个观察。
在给定当前数据结构的情况下,是否可以使用R自动执行此操作,或者必须划分日、月、年、小时、分钟、秒,然后手动删除它们?
我的数据集如下所示:

structure(list(Name = c("John", "John", "John", "John", "John", 
"James", "James", "Sandra", "Abbie", "Abbie", "Abbie", "Abbie", 
"Abbie", "Abbie", "Abbie", "Michael", "Michael", "Michael", "David", 
"David", "David", "David", "David", "David", "David", "David", 
"David", "David", "Edmund", "Charles", "Charles", "Nancy", "Emma", 
"Stephanie", "Stephanie", "Stephanie"), Date = structure(c(1640417400, 
1640331540, 1640331180, 1671783780, 1671523380, 1671090360, 1671003540, 
1667306100, 1670375640, 1670271360, 1669151640, 1671386520, 1671386400, 
1671385800, 1671359220, 1668642120, 1668275820, 1668095820, 1670055180, 
1669528080, 1669265700, 1668525360, 1667127420, 1667119740, 1667119380, 
1667115720, 1666106100, 1666106040, 1666198260, 1671629280, 1671095760, 
1672515000, 1673539500, 1670853060, 1670838660, 1669993680), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), Count = c(1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -36L))

非常感谢!

qrjkbowd

qrjkbowd1#

使用dplyr和lubridate的一个想法是,我先将你的 Dataframe 存储在data下。

library(tidyverse)
library(lubridate)
data2 <- 
  data |> 
  arrange(Name, Date) |> 
  mutate(Date2 = as.Date(Date)) |> 
  group_by(Name, Date2) |> 
  mutate(
    DateNext = lead(Date),
    Gap = int_length(interval(Date, DateNext)) / 60 / 60,
    maxGap = max(Gap, na.rm = TRUE)
  )

现在的问题是如何过滤,如果你想要一个访问时间间隔超过三小时的用户的所有用户数据,你可以这样过滤

data2 |> 
  group_by(Name)
  filter(maxGap >= 3)

如果你想进一步缩小范围,只需在group_by中添加列即可。经过再三考虑,你可能还想在构建data2时根据自己的需要调整group_by调用。不过,我希望这至少能让你知道如何去做

相关问题