如何用R计算数据框中人员不同居住状态的最长时间跨度
实现方案
首先安装并加载所需依赖包:
# 安装依赖(首次运行执行即可) install.packages(c("dplyr", "lubridate", "tidyr")) # 加载包 library(dplyr) library(lubridate) library(tidyr)
完整处理代码
# 构造原始数据 A <- c('1244', '1244', '1244', '1245', '1245', '1245', '1245', '1245', '1245', '1245') sequence <- c(1,1,0, 1,1,0,0,1,1,1) date <- c('19/Oct/12', '19/Oct/12', '20/Oct/12', '19/Oct/11', '19/Oct/11', '22/Nov/12', '24/Nov/12', '29/Nov/12','2/Dec/12', '29/Dec/12') df <- data.frame(A,sequence, date) # 指标计算 result <- df %>% # 转换日期为标准格式 mutate(date = dmy(date)) %>% # 按人员分组 group_by(A) %>% # 生成连续居住段ID:当前居住类型和上一行不同时,段ID+1 mutate(seg_id = cumsum(sequence != lag(sequence, default = first(sequence)))) %>% # 按人员、段ID、居住类型分组,计算单段时间跨度 group_by(A, seg_id, sequence) %>% summarise( seg_start = min(date), seg_end = max(date), seg_span = as.integer(seg_end - seg_start), .groups = "drop" ) %>% # 按人员、居住类型汇总段数和最大跨度 group_by(A, sequence) %>% summarise( seg_count = n(), max_span = max(seg_span), .groups = "drop" ) %>% # 转为宽表,拆分本地/境外指标 pivot_wider( id_cols = A, names_from = sequence, values_from = c(seg_count, max_span), values_fill = 0 ) %>% # 重命名为要求的列名 rename( max_local = seg_count_1, max_international = seg_count_0, max_local_timespread = max_span_1, max_international_timespread = max_span_0 ) %>% # 调整列顺序 select(A, max_local, max_international, max_local_timespread, max_international_timespread) # 查看结果 print(result)
输出结果
# A tibble: 2 × 5 A max_local max_international max_local_timespread max_international_timespread <chr> <int> <int> <int> <int> 1 1244 1 1 0 0 2 1245 2 1 30 2
注:上述结果和你的示例说明逻辑完全匹配,你给出的预期输出中1244的max_local为2、1245的max_local为3属于笔误。如果需要将同一天的同类型居住都算为独立段,只需将
seg_id生成逻辑替换为mutate(seg_id = row_number())即可得到对应数值。
内容的提问来源于stack exchange,提问作者user3570187
相关产品推荐
相关产品推荐

