如何用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 = '_'))
错误原因
你当前代码的问题有两个:
sort()函数仅接受单个向量作为输入,传入两个列会被误解析为sort(x, decreasing)的参数,无法实现按行对两个基因名排序。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
相关产品推荐
相关产品推荐

