在R中基于条件为数据框创建genoType新列的方法
在R中按规则生成genoType列
问题描述
现有如下数据框,需要新增genoType列:
df <- data.frame( srr = c("sampleA", "sampleB", "sampleC", "sampleD"), position = c(16, 16, 16, 16), refBase = c("G", "G", "G", "G"), altBase = c("G", "C", "A", "T") )
规则:
- 当
altBase等于refBase时,赋值为"0/0" - 当
altBase与refBase不同时,按碱基出现顺序依次赋值为"0/1"、"0/2"、"0/3"等
原代码问题分析
你之前的代码存在两个核心问题:
- 分组错误:按
srr分组会导致每个样本单独处理,无法跨样本判断非参考碱基的出现顺序 - 逻辑缺陷:
duplicated只能区分碱基是否重复,无法生成连续递增的编号,无法满足"0/1"、"0/2"这类序列的需求
有效实现方法
方法1:使用dplyr包
library(dplyr) df <- df %>% # 按位置和参考碱基分组,确保同位置同参考碱基的样本一起处理 group_by(position, refBase) %>% mutate( # 为非参考碱基分配递增编号,参考碱基编号为0 alt_index = case_when( altBase == refBase ~ 0, TRUE ~ match(altBase, unique(altBase[altBase != refBase])) ), # 生成genoType列 genoType = ifelse(alt_index == 0, "0/0", paste0("0/", alt_index)) ) %>% # 可选:删除中间辅助列 select(-alt_index) %>% ungroup()
方法2:基础R实现(无需额外包)
# 按position和refBase分组处理每个样本的altBase df$genoType <- with(df, ave(altBase, position, refBase, FUN = function(x) { current_ref <- unique(x[x == refBase])[1] # 生成编号:参考碱基为0,非参考碱基按出现顺序取1、2、3... type_num <- ifelse(x == current_ref, 0, match(x, unique(x[x != current_ref]))) # 转换为指定字符串格式 ifelse(type_num == 0, "0/0", paste0("0/", type_num)) }))
运行后即可得到期望的结果:
> df srr position refBase altBase genoType 1 sampleA 16 G G 0/0 2 sampleB 16 G C 0/1 3 sampleC 16 G A 0/2 4 sampleD 16 G T 0/3
内容的提问来源于stack exchange,提问作者Honorato
相关产品推荐
相关产品推荐

