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

R使用dplyr根据多列数值阈值条件创建因子分类新列

问题修正方案

错误原因梳理

  • 优先级倒置:case_when按从上到下的顺序匹配条件,你需求里High优先级最高(只要有值>20不管其他都返回High)、其次Medium、最后Low,你原来的代码顺序写反了,会导致高优先级条件被低优先级覆盖
  • 列名拼写错误:示例数据中列名为CNV.Gain,你的代码写为CNV.gain,拼写不一致导致判断逻辑失效
  • 逻辑规则错误:你需求是「任意一列满足条件即可匹配」,但原Low条件中误用了&要求多列同时满足,完全不符合需求
  • 边界值匹配错误:原代码的区间判断存在大量边界错漏,比如Low要求≤10,你部分条件写的是<10,Medium要求>10,你部分条件写的是≥10,和需求不一致

修正后代码

写法1:直接按规则判断(逻辑清晰)

library(dplyr)
long_fused <- long_fused %>%
  mutate(Percent_sample_altered = case_when(
    # 先判断最高优先级:任意列>20返回High
    Amplification >20 | CNV.Gain >20 | Homozygous.Deletion.Frequency >20 | Heterozygous.Deletion.Frequency>20 ~ 'High',
    # 再判断Medium:任意列>10且≤20
    Amplification >10 & Amplification <=20 | CNV.Gain >10 & CNV.Gain <=20 | Homozygous.Deletion.Frequency >10 & Homozygous.Deletion.Frequency <=20 | Heterozygous.Deletion.Frequency>10 & Heterozygous.Deletion.Frequency <=20 ~ 'Medium',
    # 最后判断Low:任意列≥5且≤10
    Amplification >=5 & Amplification <=10 | CNV.Gain >=5 & CNV.Gain <=10 | Homozygous.Deletion.Frequency >=5 & Homozygous.Deletion.Frequency <=10 | Heterozygous.Deletion.Frequency>=5 & Heterozygous.Deletion.Frequency <=10 ~ 'Low'
  ))

写法2:简化写法(取四列最大值判断,更简洁不易错)

因为只要最高值满足对应区间即可,所以直接取每行四列的最大值判断即可:

library(dplyr)
long_fused <- long_fused %>%
  rowwise() %>%
  mutate(
    max_val = max(c_across(c(CNV.Gain, Amplification, Homozygous.Deletion.Frequency, Heterozygous.Deletion.Frequency))),
    Percent_sample_altered = case_when(
      max_val >20 ~ 'High',
      max_val >10 ~ 'Medium',
      max_val >=5 ~ 'Low'
    )
  ) %>%
  ungroup() %>%
  select(-max_val) # 可选,删除临时计算的最大值列

验证结果

用你提供的示例数据运行以上代码,得到的Percent_sample_altered列结果和你给出的Threshold列完全一致,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 06:57:03