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

如何在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)

代码逻辑解释

  1. 首先提取所有CLS=1的Day值,取最小值作为CLS=0行的“下一个阶段起始日期”
  2. 使用case_when条件语句:
    • 当CLS=0时,用目标日期减去当前Day得到Day.Before_nextCLS
    • 其他情况(即CLS=1)直接赋值为NA

内容的提问来源于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.05 01:20:47