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

如何在R中按列条件筛选行并转换DataFrame结构

在R中处理DataFrame生成目标结构的方法

首先加载dplyr包(未安装的话先执行install.packages("dplyr")),按以下步骤操作:

1. 构建示例数据

先把你的原始数据转化为可运行的DataFrame:

df <- data.frame(
  SYMBOL = c("AFDN", "AHR", "AHR", "AKT1", "AKT1", "APC"),
  CANCER_TYPE = c("BLADDER3", "BLADDER3", "BLADDER2", "BLADDER3", "BLADDER2", "BLADDER2"),
  TIER = c(2, 1, 1, 1, 2, 2)
)

2. 执行数据转换操作

使用dplyr的分组、突变、筛选和去重逻辑完成转换:

library(dplyr)

result_df <- df %>%
  group_by(SYMBOL) %>%
  mutate(
    # 判断当前基因是否关联两种癌症类型
    has_both = n_distinct(CANCER_TYPE) == 2,
    # 生成Highest列:优先取BLADDER3,无则取BLADDER2
    Highest = if("BLADDER3" %in% CANCER_TYPE) "BLADDER3" else "BLADDER2",
    # 修改CANCER_TYPE列:有两种类型则显示both,否则保留原类型
    CANCER_TYPE = ifelse(has_both, "both", CANCER_TYPE)
  ) %>%
  # 筛选出对应Highest层级的记录,确保TIER值正确
  filter(CANCER_TYPE == Highest | has_both) %>%
  # 每个基因只保留一行
  distinct(SYMBOL, .keep_all = TRUE) %>%
  # 移除临时辅助列
  select(-has_both) %>%
  ungroup()

3. 查看结果

运行后result_df的结构与需求完全一致:

print(result_df)
#   SYMBOL CANCER_TYPE Highest TIER
# 1   AFDN    BLADDER3 BLADDER3    2
# 2    AHR        both BLADDER3    1
# 3   AKT1        both BLADDER3    1
# 4    APC    BLADDER2 BLADDER2    2

关键逻辑说明

  • 分组处理:按SYMBOL分组,确保每个基因的所有关联记录被统一处理;
  • 层级优先级:根据目标结果,将BLADDER3设为最高层级,同时存在两种类型时优先取该值;
  • 类型合并:当一个基因关联两种癌症类型时,将CANCER_TYPE列替换为both;
  • 去重筛选:确保每个基因仅保留一行,且TIER值对应最高层级的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:10:14