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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:54:02