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

