我的数据框如下:
AS<-c("Composite", "DGIdb", "DrugBank", "DrugCentral_Human",
"Repurposing", "LINCS_Data_Portal","TargetCentral")
ASe<-c("Composite", "DGIdb", "DrugBank", "DrugCentral (Human)",
"Drug Repurposing Hub", "LINCS Data Portal","TargetCentral")
d<-data.frame(AS,ASe)
然后我尝试根据ASe
列的字母顺序对其进行排序
d[order(d$ASe),]
我得到的结果是:
AS ASe
1 Composite Composite
2 DGIdb DGIdb
5 Repurposing Drug Repurposing Hub
3 DrugBank DrugBank
4 DrugCentral_Human DrugCentral (Human)
6 LINCS_Data_Portal LINCS Data Portal
7 TargetCentral TargetCentral
但是我认为DrugBank
和DrugCentral (Human)
应该在Drug Repurposing Hub
之前,因为字母B和C在字母R之前。我想念什么?
答案 0 :(得分:4)
如评论中所述,问题在于数据框中的列不是字符而是因素。大多数时候,使用字符会更方便。在这种情况下,您可以在stringsAsFactors = FALSE
内使用data.frame(...)
。
然后,您可以根据第二列进行排序:
d2 <- data.frame(AS,ASe, stringsAsFactors =FALSE)
d2[order(d2$ASe),]
AS ASe
1 Composite Composite
2 DGIdb DGIdb
5 Repurposing Drug Repurposing Hub
3 DrugBank DrugBank
4 DrugCentral_Human DrugCentral (Human)
6 LINCS_Data_Portal LINCS Data Portal
7 TargetCentral TargetCentral
如您所见,第二列ASe
的字母顺序正确。每个字母前都有一个空格字符串(即" "
)。因此,Drug Repurposing Hub
在DrugBank
之前。
如果您坚持要最后放置空间,则可以使用以下解决方法:
d2[order(gsub(" ", "z", d2$ASe)),]
AS ASe
1 Composite Composite
2 DGIdb DGIdb
3 DrugBank DrugBank
4 DrugCentral_Human DrugCentral (Human)
5 Repurposing Drug Repurposing Hub
6 LINCS_Data_Portal LINCS Data Portal
7 TargetCentral TargetCentral
编辑: Ben Bolker建议的解决方案更好:
d2[order(gsub(" ", "", d2$ASe)),]