dplyr数据处理代码冗余简化及已合并数据集操作咨询
代码冗余点和简化方案
现有代码的冗余/逻辑问题
- 不必要的重复管道步骤:多个连续的
mutate操作可以合并为一个,减少无意义的管道调用 - 两次
pivot_longer存在逻辑错误和冗余:现有写法会生成pre指标和post指标的全量笛卡尔积,出现大量不符合逻辑的跨指标配对(比如MetricA_Pre和MetricB_Post匹配到同一行),完全可以通过单次pivot_longer搭配名称拆分规则实现正确的长表转换 - 冗余的排序操作:两次
pivot_longer后的arrange没有实际业务必要,可删除,若需最终排序可在所有处理完成后统一执行 - 重复的因子水平硬编码:
outcome_pre和outcome_post的因子水平可以通过转换时自动生成,无需手动逐个录入,减少硬编码出错概率 - 无效的ARM重编码逻辑:从你提供的合并后数据集来看,ARM字段已经只有
ENHANCED和STANDARD两个取值,没有REFERENCE取值,若原始合并后的数据确实不存在该值,第一步的ifelse重编码可以直接删除
简化后代码
以下代码实现的效果和原代码预期一致,同时修正了原代码的配对错误,行数减少近60%:
library(dplyr) library(tidyr) analysis_df <- raw_df %>% # 合并所有mutate操作 mutate( # 若确认原始数据没有REFERENCE可直接删除下面这行ARM重编码逻辑 ARM = ifelse(ARM == "REFERENCE", "STANDARD", "ENHANCED"), ARM = factor(ARM, levels = c("STANDARD", "ENHANCED")), SEX = factor(if_else(SEX == 1, "Male", "Female"), levels = c("Male", "Female")) ) %>% # 单次长表转换拆分指标名称和测量时间点,避免错误配对 pivot_longer( cols = MetricA_Pre:MetricF_Post, names_to = c("metric", "time"), names_sep = "_", values_to = "score" ) %>% # 如需pre、post得分拆分为两列可保留下面这行,不需要直接删除即可 pivot_wider(names_from = time, values_from = score) %>% # 自动生成指标因子水平,无需手动硬编码 mutate( metric = factor(metric, levels = paste0("Metric", LETTERS[1:6])) )
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

