基于群体移动数据集生成分组/位置对应的时间范围
生成群体位置停留时间范围的解决方案
数据预处理
首先需要将原始数据中的字符型'NA'转换为真实的NA值,并将日期、位置字段转换为合适的类型,确保后续处理的准确性:
library(data.table) df = data.table(Date = c('01/01/2021', '06/01/2021', '09/01/2021', '10/01/2021', '20/01/2021', '24/01/2021'), Group = c('Group A', 'Group A', 'Group B', 'Group B', 'Group B', 'Group A'), From = c('NA', 1, 3, 4, 5, 4), To = c(1, 'NA', 4, 5, 'NA', 1)) # 替换字符NA为真实NA,并转换为数值型 df[, c('From', 'To') := lapply(.SD, function(x) { x[x == 'NA'] <- NA as.numeric(x) }), .SDcols = c('From', 'To')] # 转换日期格式为Date类型,并按分组和日期排序 df[, Date := as.Date(Date, format = '%d/%m/%Y')] setorder(df, Group, Date)
生成停留时间范围表
通过提取"进入"和"退出"事件,再利用data.table的滚动连接匹配对应关系,得到每个位置的停留时间:
# 提取所有进入事件(To非NA的记录) entry_events <- df[!is.na(To), .(Group, Date_entry = Date, Location = To)] # 提取所有退出事件(From非NA的记录) exit_events <- df[!is.na(From), .(Group, Date_exit = Date, Location = From)] # 滚动匹配同组同位置的最近退出事件 result <- entry_events[exit_events, on = .(Group, Location), Date_exit := i.Date_exit, roll = -Inf] # 处理无退出记录的情况(设为NA) result[is.na(Date_exit), Date_exit := NA] # 转换日期格式回原始的dd/mm/yyyy样式 result[, c('Date_entry', 'Date_exit') := lapply(.SD, function(x) { ifelse(is.na(x), NA, format(x, '%d/%m/%Y')) }), .SDcols = c('Date_entry', 'Date_exit')] # 查看结果 print(result)
输出结果
运行上述代码后,将得到符合需求的停留时间表:
Group Date_entry Date_exit Location 1: Group A 01/01/2021 06/01/2021 1 2: Group A 24/01/2021 <NA> 1 3: Group B 09/01/2021 10/01/2021 4 4: Group B 10/01/2021 20/01/2021 5
内容的提问来源于stack exchange,提问作者BWolk
相关产品推荐
相关产品推荐

