如何按基因score排序Dataframe?R语言报错问题求助
为什么会报错?
你写的代码尝试把gene列转换成因子,但用了c1m.tcps_up$gene[order(c1m.tcps_up$score)]作为因子水平——这里的核心问题是:你的Dataframe里每个基因对应多行重复数据(比如2310043M15Rik出现了24次),导致这个向量里有大量重复的基因名,而因子的水平必须是唯一值,这就触发了factor level [2] is duplicated的错误。
另外从你的数据能看出来,每个基因对应的score是固定的(比如所有2310043M15Rik的score都是0.8192723),所以你的需求应该是按score对整个表格排序,或者让基因的显示顺序跟随score的高低排列?下面分两种场景给你解决方法:
方法1:直接对整个Dataframe按score排序
如果你的目标是让表格所有行按score的大小排序(同score的基因自动归为一组),不需要修改因子,用基础R或dplyr都能快速实现:
用基础R:
# 按score升序排序(从小到大) c1m.tcps_up_sorted <- c1m.tcps_up[order(c1m.tcps_up$score), ] # 按score降序排序(从大到小),加负号即可 c1m.tcps_up_sorted <- c1m.tcps_up[order(-c1m.tcps_up$score), ]
用dplyr(语法更直观):
先安装并加载dplyr包:
install.packages("dplyr") library(dplyr)
然后执行排序:
# 升序排序 c1m.tcps_up_sorted <- c1m.tcps_up %>% arrange(score) # 降序排序 c1m.tcps_up_sorted <- c1m.tcps_up %>% arrange(desc(score))
方法2:修改gene的因子水平,让基因按score顺序排列
如果你想让gene列作为因子,其水平顺序跟随score的高低(比如score高的基因排在前面),需要先提取唯一的基因-score对应关系,排序后再设置因子水平:
# 提取每个基因对应的唯一score,按score排序后提取基因名 gene_score_order <- c1m.tcps_up %>% distinct(gene, score) %>% arrange(score) %>% pull(gene) # 把gene列转换成因子,水平按上面的顺序设置 c1m.tcps_up$gene <- factor(c1m.tcps_up$gene, levels = gene_score_order) # 此时按gene排序,就会自动遵循score的顺序 c1m.tcps_up_sorted <- c1m.tcps_up[order(c1m.tcps_up$gene), ]
这样做的关键是distinct(gene, score)会去掉重复的基因-score对,得到每个基因唯一的一行,排序后提取的基因名都是唯一值,就不会再出现因子水平重复的问题了。
测试验证
用你的数据测试的话,gene_score_order会是c("5730508B09Rik", "2310043M15Rik")(因为前者的score更低),设置因子水平后,基因的显示顺序就会跟随score从小到大排列。
内容的提问来源于stack exchange,提问作者Helpful_Triazole

