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

在R语言中获取TPR_ar序列第二次出现PD的首个日期

提取特定连续PD序列的首个日期

我需要从以下数据中提取特定日期:

~SUBJID, ~TP.DATE, ~TPR_ar,
'2617001', '2019-04-11', 'Undefined',
'2617001', '2019-07-09', 'PD',       
'2617001', '2019-09-07', 'PD',       
'2617001', '2019-10-19', 'PD',      
'2617001', '2019-11-12', 'PD',      
'2617001', '2020-01-13', 'PR',      
'2617001', '2020-02-24', 'PD',
'2617001', '2020-03-24', 'PD',
)

观察数据可知,TPR_ar的序列为:'Undefined', 'PD', 'PR', 'PD'。我想要获取第二次PD序列中的首个日期(即2020-02-24),恳请各位帮忙!


Python 解决方法

核心思路是先给连续相同的TPR_ar值标记分组ID,再筛选出第二个PD组的第一条记录:

import pandas as pd

# 构造数据集
data = [
    ('2617001', '2019-04-11', 'Undefined'),
    ('2617001', '2019-07-09', 'PD'),
    ('2617001', '2019-09-07', 'PD'),
    ('2617001', '2019-10-19', 'PD'),
    ('2617001', '2019-11-12', 'PD'),
    ('2617001', '2020-01-13', 'PR'),
    ('2617001', '2020-02-24', 'PD'),
    ('2617001', '2020-03-24', 'PD'),
]

df = pd.DataFrame(data, columns=['SUBJID', 'TP.DATE', 'TPR_ar'])

# 标记连续相同TPR_ar的分组ID
df['group_id'] = (df['TPR_ar'] != df['TPR_ar'].shift()).cumsum()

# 筛选所有PD组,保留每个组的第一条记录,再取第二个组的日期
pd_groups = df[df['TPR_ar'] == 'PD'].drop_duplicates('group_id', keep='first')
target_date = pd_groups.iloc[1]['TP.DATE']

print(target_date)  # 输出结果:2020-02-24

R 解决方法

用dplyr链式操作快速实现:

library(dplyr)

# 构造数据集
data <- tibble(
  SUBJID = rep('2617001', 8),
  TP.DATE = c('2019-04-11', '2019-07-09', '2019-09-07', '2019-10-19',
              '2019-11-12', '2020-01-13', '2020-02-24', '2020-03-24'),
  TPR_ar = c('Undefined', 'PD', 'PD', 'PD', 'PD', 'PR', 'PD', 'PD')
)

# 标记分组、筛选PD组、取第二个组的首个日期
target_date <- data %>%
  mutate(group_id = cumsum(TPR_ar != lag(TPR_ar, default = first(TPR_ar)))) %>%
  filter(TPR_ar == 'PD') %>%
  distinct(group_id, .keep_all = TRUE) %>%
  slice(2) %>%
  pull(TP.DATE)

print(target_date)  # 输出结果:2020-02-24

内容的提问来源于stack exchange,提问作者D. Shin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:05:55