列值的字母顺序不正确

时间:2019-05-22 19:17:53

标签: r dataframe

我的数据框如下:

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

但是我认为DrugBankDrugCentral (Human)应该在Drug Repurposing Hub之前,因为字母B和C在字母R之前。我想念什么?

1 个答案:

答案 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 HubDrugBank之前。

如果您坚持要最后放置空间,则可以使用以下解决方法:

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)),]