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

在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"等

原代码问题分析

你之前的代码存在两个核心问题:

  1. 分组错误:按srr分组会导致每个样本单独处理,无法跨样本判断非参考碱基的出现顺序
  2. 逻辑缺陷: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:41:12