如何在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
相关产品推荐
相关产品推荐

