R语言按分组条件修改值:基于两个数据框的时间戳差值判断
实现方案
核心逻辑
- 先对
df2按UserID分组,统计每个用户的最晚EndTime - 将统计结果与
df1按UserID关联 - 对比
df1中每行的Time与对应用户的最晚EndTime,差值≥60分钟的,将Value修改为NoGroup - 清理掉计算过程中新增的辅助列,得到最终结果
代码实现
方法1:tidyverse(dplyr)实现
library(dplyr) # 统计每个用户的最晚EndTime user_max_end <- df2 %>% group_by(UserID) %>% summarise(max_EndTime = max(EndTime), .groups = "drop") # 关联df1并修改符合条件的Value df1_result <- df1 %>% left_join(user_max_end, by = "UserID") %>% mutate(Value = if_else(Time - max_EndTime >= 3600, "NoGroup", Value)) %>% select(-max_EndTime)
注:POSIXct格式的时间差值默认单位为秒,60分钟对应3600秒。
方法2:base R实现
# 统计每个用户的最晚EndTime user_max_end <- aggregate(EndTime ~ UserID, df2, max) # 关联到df1 df1_merged <- merge(df1, user_max_end, by = "UserID", all.x = TRUE) # 替换符合条件的Value df1_merged$Value[as.numeric(difftime(df1_merged$Time, df1_merged$EndTime, units = "mins")) >= 60] <- "NoGroup" # 保留原始列得到结果 df1_result <- df1_merged[, names(df1)]
结果验证
两种方法得到的df1_result完全符合你给出的预期输出,对CCC、DDD用户超时的记录都做了正确的NoGroup替换。
内容的提问来源于stack exchange,提问作者metaltoaster
相关产品推荐
相关产品推荐

