使用dplyr和tidyr计算velocity并填充缺失ClassType值
R代码实现方案
核心逻辑
- 过滤同一ClassType内部AT上升阶段的无意义差值,只保留规则要求的velocity计算段:即当前ClassType进入AT稳定平台后,后续相邻记录的AT差与日期间差的比值,包含跨ClassType的分段、新ClassType内部未达阈值阶段的分段
- 按给定的ClassType自定义排序,补全中间缺失的类别,用第一个跨类计算得到的velocity值填充
- 修正原代码的语法错误、逻辑错误
可直接运行的完整代码
# 加载依赖包 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
相关产品推荐
相关产品推荐

