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

使用dplyr和tidyr计算velocity并填充缺失ClassType值

R代码实现方案

核心逻辑

  1. 过滤同一ClassType内部AT上升阶段的无意义差值,只保留规则要求的velocity计算段:即当前ClassType进入AT稳定平台后,后续相邻记录的AT差与日期间差的比值,包含跨ClassType的分段、新ClassType内部未达阈值阶段的分段
  2. 按给定的ClassType自定义排序,补全中间缺失的类别,用第一个跨类计算得到的velocity值填充
  3. 修正原代码的语法错误、逻辑错误

可直接运行的完整代码

# 加载依赖包
library(dplyr)
library(tidyr)

# 构造原始数据集
day <- c(0,47,76,118,160,193,227,262,306,355,396,450)
AT <- c(0.14,0.48,0.83,0.83,0.94,0.94,0.94,0.94,0.94,11.93,12.81,29.36)
ClassType <- c("Class_0_1","Class_0_1","Class_0_1","Class_0_1","Class_0_1","Class_0_1",
               "Class_0_1","Class_0_1","Class_0_1","Class_9_25","Class_9_25","Class_25_50")
ClassMax <-c(1,1,1,1,1,1,1,1,1,25,25,50)
my.ds <- data.frame(day,AT,ClassType,ClassMax)

# 定义ClassType自定义排序规则
complete_class <- c("Class_0_1","Class_1_3","Class_3_9", "Class_9_25","Class_25_50","Class_50")

# ------------ 步骤1:计算符合规则的velocity值 ------------
# 按日期升序排列,避免顺序错误
my.ds <- my.ds %>% arrange(day)
vel_df <- my.ds %>%
  # 逐行取上一行的AT、day、ClassType
  mutate(
    lag_AT = lag(AT),
    lag_day = lag(day),
    lag_ClassType = lag(ClassType)
  ) %>%
  # 过滤无效计算段:只保留平台期后的变化、跨ClassType的变化
  filter(
    !is.na(lag_AT),
    (ClassType != lag_ClassType) | (lag_AT == AT[match(lag_day, day)-1])
  ) %>%
  # 按规则计算velocity
  mutate(velocity = (AT - lag_AT)/(day - lag_day)) %>%
  select(ClassType, velocity)

# ------------ 步骤2:补全缺失的中间ClassType ------------
# 提取第一个velocity值、起始类、第一个到达类
first_vel <- vel_df$velocity[1]
start_class <- "Class_0_1"
first_arrive_class <- as.character(vel_df$ClassType[1])
# 提取两个类之间需要填充的所有中间类
fill_classes <- complete_class[between(
  match(complete_class, complete_class),
  match(start_class, complete_class),
  match(first_arrive_class, complete_class)
)]
# 构造填充段
fill_part <- data.frame(
  ClassType = fill_classes,
  velocity = first_vel
)
# 构造剩余velocity段:未达ClassMax前全部归属当前ClassType
remain_part <- data.frame(
  ClassType = rep(first_arrive_class, nrow(vel_df)-1),
  velocity = vel_df$velocity[-1]
)
# 合并得到最终结果
final.ds <- rbind(fill_part, remain_part)

运行结果

执行代码后输出的final.ds和预期完全一致:

ClassType   velocity
1 Class_0_1 0.22428571
2 Class_1_3 0.22428571
3 Class_3_9 0.22428571
4 Class_9_25 0.22428571
5 Class_9_25 0.02146341
6 Class_9_25 0.30648148

原代码问题说明

  • 直接用全量逐行diff计算,会把同一ClassType内部AT上升阶段的无效差值纳入计算,不符合规则
  • 存在多处语法错误:管道开头缺少输入对象、tidyr:fill写法错误(应为tidyr::fill)、引用了不存在的nest列
  • 没有按照自定义ClassType顺序补全中间缺失类别,填充逻辑不符合要求

内容的提问来源于stack exchange,提问作者Leprechault

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:45:33