如何按规则计算数据集的Delta1、Delta2时间差值列
数据集新增Delta计算列实现方法
原始数据集样例
ID Type Time1 Time2 Time3 1 A1 12.23 NA NA 2 A1 0.35 0.53 NA 2 A2 5.78 NA 10.25 3 A5 NA NA 4.19 4 A3 NA 3.18 7.15 5 A5 10.91 4.56 2.45
明确计算规则
- Delta1:仅当同一行内Time1、Time2、Time3三个值均非缺失时,取值为
Time2 - Time1,其余行该列留空。例如ID=5的行三个时间值均存在,Delta1 = 4.56-10.91 = -6.35 - Delta2:按行内非缺失时间值的组合计算差值:仅存在Time1+Time2非空时取
Time2-Time1,仅存在Time1+Time3非空时取Time3-Time1,仅存在Time2+Time3非空时取Time3-Time2,三个值均非空时取Time3-Time2;如果行内非缺失时间值不足2个,取值为0
期望输出效果
ID Type Time1 Time2 Time3 Delta1 Delta2 1 A1 12.23 NA NA 0 2 A1 0.35 0.53 NA 0.18 2 A2 5.78 NA 10.25 4.47 3 A5 NA NA 4.19 0 4 A3 NA 3.18 7.15 3.97 5 A5 10.91 4.56 2.45 -6.35 -2.11
R语言实现代码(基于dplyr)
按行判断缺失情况匹配计算规则即可,代码可直接运行:
library(dplyr) result_df <- raw_df %>% rowwise() %>% mutate( # 计算Delta1 Delta1 = ifelse(all(!is.na(c(Time1, Time2, Time3))), Time2 - Time1, NA_real_), # 统计每行非缺失时间值个数,辅助计算Delta2 valid_time_num = sum(!is.na(c(Time1, Time2, Time3))), Delta2 = case_when( valid_time_num < 2 ~ 0, !is.na(Time1) & !is.na(Time2) & is.na(Time3) ~ Time2 - Time1, !is.na(Time1) & is.na(Time2) & !is.na(Time3) ~ Time3 - Time1, is.na(Time1) & !is.na(Time2) & !is.na(Time3) ~ Time3 - Time2, TRUE ~ Time3 - Time2 ) ) %>% select(-valid_time_num) %>% ungroup()
运行后输出结果和预期完全一致。
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

