在R中如何根据多条件将数值得分列转换为新的分组列
分组需求实现方案
实现思路
- 先提取所有非0的得分值,单独计算该子集的33%、66%分位数,避免0值干扰分位数计算结果
- 对全量数据按规则生成分组列:得分=0标记为
none,非0得分对照提前算出的分位数阈值,分别标记为low/middle/high - 分位数计算默认忽略缺失值,若你的数据存在缺失得分,可提前过滤或增加缺失值分支处理,避免影响后续Kaplan-Meier分析准确性
R 实现(适配生存分析场景)
# 加载依赖包 library(dplyr) # 示例数据,替换为你自己的实际数据框即可 df <- data.frame( score = sample(c(0, runif(1000, 1, 1000)), size = 1500, replace = TRUE) ) # 计算非0得分的分位数阈值 non_zero_score <- df$score[df$score > 0] quantile_thres <- quantile(non_zero_score, probs = c(0.33, 0.66), na.rm = T) # 生成分组列 df <- df %>% mutate( Score_status = case_when( score == 0 ~ "none", score <= quantile_thres[1] ~ "low", score <= quantile_thres[2] ~ "middle", TRUE ~ "high" ) ) # 验证分组分布 table(df$Score_status, useNA = "ifany")
Python 实现(适配生存分析场景)
import pandas as pd import numpy as np # 示例数据,替换为你自己的实际数据框即可 df = pd.DataFrame({ "score": np.append(np.random.randint(1, 1000, 1000), np.zeros(500, dtype=int)) }) # 计算非0得分的分位数阈值 non_zero_score = df.loc[df["score"] > 0, "score"] q33, q66 = non_zero_score.quantile([0.33, 0.66]) # 生成分组列 conditions = [ df["score"] == 0, df["score"] <= q33, df["score"] <= q66 ] labels = ["none", "low", "middle"] df["Score_status"] = np.select(conditions, labels, default="high") # 验证分组分布 print(df["Score_status"].value_counts(dropna=False))
内容的提问来源于stack exchange,提问作者vzsmith
相关产品推荐
相关产品推荐

