You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于群体移动数据集生成分组/位置对应的时间范围

生成群体位置停留时间范围的解决方案

数据预处理

首先需要将原始数据中的字符型'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:25:17