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

如何用tidyverse按行将两列基因名排序后拼接为新列?

解决tidyverse按行排序拼接基因对的问题

你的核心问题是原代码未执行按行操作,而是对两列全局合并排序,以下是两种符合tidyverse风格的正确解决方案:

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

library(tidyverse)

# 加载你的数据框
d <- structure(list(gene1 = c("SEC23A", "SAR1A", "COQ10B", "AP2A2", "CUL4A", "PITPNA"), 
                    gene2 = c("SEC23B", "SAR1B", "COQ10A", "AP2A1", "CUL4B", "PITPNB")), 
               row.names = c(NA, -6L), class = "data.frame")

# 生成排序后的基因对列
d_processed <- d %>%
  rowwise() %>% # 开启逐行处理模式
  mutate(sorted_gene_pair = paste(sort(c(gene1, gene2)), collapse = "_")) %>%
  ungroup() # 取消逐行分组,避免影响后续操作

# 查看结果
print(d_processed)

方法2:用purrr的map2_chr逐元素配对处理

这种方法无需分组,更简洁高效:

d_processed <- d %>%
  mutate(sorted_gene_pair = map2_chr(gene1, gene2, ~paste(sort(c(.x, .y)), collapse = "_")))

输出结果

两种方法均会得到符合预期的输出:

gene1  gene2 sorted_gene_pair
1 SEC23A SEC23B SEC23A_SEC23B
2  SAR1A  SAR1B SAR1A_SAR1B
3 COQ10B COQ10A COQ10B_COQ10A
4  AP2A2  AP2A1 AP2A1_AP2A2
5  CUL4A  CUL4B CUL4A_CUL4B
6 PITPNA PITPNB PITPNA_PITPNB

原代码问题说明

原代码中sort(c(gene1, gene2))会将gene1和gene2两列的所有元素合并成一个全局向量排序,而非逐行取两个元素排序,因此无法得到预期的逐行拼接结果。

内容的提问来源于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.10 13:55:17