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

如何用dplyr的mutate方法生成两列排序拼接的新列?

问题:对数据框两列内容排序后拼接成新列

现有包含sgRNA1_Approved_Symbol和sgRNA2_Approved_Symbol列的数据框x,需要用dplyr的mutate方法创建新列,将这两列内容按字母排序后用下划线分隔拼接。数据框结构如下:

> dput(x)
structure(list(sgRNA1_Approved_Symbol = c("ADAD1", "ADAD1", "ADAD1", 
"ADAD1", "ADAD1", "ADAD1", "ADAD1", "ADAD1", "ADAD1", "ADAD1"
), sgRNA2_Approved_Symbol = c("AKT1", "AKT1", "AKT1", "AKT1", 
"BRD4", "BRD4", "BRD4", "BRD4", "MYC", "MYC")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

用户尝试的代码:

x %>% 
  mutate(sorted_gene_pair = paste(sort(sgRNA1_Approved_Symbol, sgRNA2_Approved_Symbol), collapse = '_'))

错误原因

你当前代码的问题有两个:

  1. sort()函数仅接受单个向量作为输入,传入两个列会被误解析为sort(x, decreasing)的参数,无法实现按行对两个基因名排序。
  2. collapse='_'会将所有行的排序结果拼接成一个单一字符串,导致新列所有行的值完全相同,不符合按行处理的需求。

正确实现方法

方法1:使用rowwise()逐行处理

通过rowwise()让dplyr按行执行操作,再对每一行的两个基因名组成的向量排序后拼接:

library(dplyr)

x %>%
  rowwise() %>%
  mutate(sorted_gene_pair = paste(sort(c(sgRNA1_Approved_Symbol, sgRNA2_Approved_Symbol)), collapse = "_")) %>%
  ungroup()  # 取消行分组,恢复数据框默认行为

方法2:使用purrr::pmap_chr()高效逐行映射

如果数据量较大,pmap_chr()的效率更高,无需行分组:

library(dplyr)
library(purrr)

x %>%
  mutate(sorted_gene_pair = pmap_chr(
    list(sgRNA1_Approved_Symbol, sgRNA2_Approved_Symbol),
    ~ paste(sort(c(..1, ..2)), collapse = "_")
  ))

方法3:用ifelse手动判断字母顺序(无需额外加载purrr)

直接通过字符串比较判断顺序,实现排序拼接:

library(dplyr)

x %>%
  mutate(sorted_gene_pair = ifelse(
    sgRNA1_Approved_Symbol < sgRNA2_Approved_Symbol,
    paste(sgRNA1_Approved_Symbol, sgRNA2_Approved_Symbol, sep = "_"),
    paste(sgRNA2_Approved_Symbol, sgRNA1_Approved_Symbol, sep = "_")
  ))

以上三种方法都能得到预期结果:新列sorted_gene_pair中每一行都是对应行的两个基因名按字母排序后,用下划线连接的字符串,比如第一行结果为ADAD1_AKT1,第五行结果为ADAD1_BRD4。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:10:46