如何在R语言中基于条件计算Day.Before_nextCLS列?
问题描述
需要基于给定的3列数据计算Day.Before_nextCLS列,输入数据如下:
tibble::tribble( ~Day, ~CLS, ~BAL.D, 0, 0, NA, 3, 0, 15000, 6, 0, 10000, 20, 0, 2000, 25, 0, -4771299, 26, 0, -1615637, 27, 0, -920917, 31, 1, -923089, 32, 1, -81863, 33, 1, 19865, 34, 1, 9865, 37, 1, 609865 )
期望输出的结果如下:
tibble::tribble( ~Day, ~CLS, ~BAL.D, ~Day.Before_nextCLS, 0, 0, NA, 31, 3, 0, 15000, 28, 6, 0, 10000, 25, 20, 0, 2000, 11, 25, 0, -4771299, 6, 26, 0, -1615637, 5, 27, 0, -920917, 4, 31, 1, -923089, NA, 32, 1, -81863, NA, 33, 1, 19865, NA, 34, 1, 9865, NA, 37, 1, 609865, NA )
计算逻辑说明:
- 对于
CLS=0的行,Day.Before_nextCLS等于第一个出现的CLS=1对应的Day值减去当前行的Day值(例如Day27对应的计算为31-27=4) - 对于
CLS=1的行,由于没有后续更高CLS值的记录,Day.Before_nextCLS设为NA
解决方案
可以使用tidyverse工具包实现需求,代码如下:
library(tidyverse) # 定义输入数据 df <- tibble::tribble( ~Day, ~CLS, ~BAL.D, 0, 0, NA, 3, 0, 15000, 6, 0, 10000, 20, 0, 2000, 25, 0, -4771299, 26, 0, -1615637, 27, 0, -920917, 31, 1, -923089, 32, 1, -81863, 33, 1, 19865, 34, 1, 9865, 37, 1, 609865 ) # 获取第一个CLS=1对应的Day值 next_cls_day <- df %>% filter(CLS == 1) %>% pull(Day) %>% min() # 计算目标列 df_result <- df %>% mutate(Day.Before_nextCLS = case_when( CLS == 0 ~ next_cls_day - Day, TRUE ~ NA_integer_ )) # 查看结果 print(df_result)
代码逻辑解释
- 首先提取所有
CLS=1的Day值,取最小值作为CLS=0行的“下一个阶段起始日期” - 使用
case_when条件语句:- 当
CLS=0时,用目标日期减去当前Day得到Day.Before_nextCLS - 其他情况(即
CLS=1)直接赋值为NA
- 当
内容的提问来源于stack exchange,提问作者D. Shin
相关产品推荐
相关产品推荐

