如何按行的相似性对数据帧进行排序和排序

时间:2017-06-28 14:37:49

标签: r dataframe unique

newdf
         Beginning1 Protein2    Protein3    Protein4    Biomarker1
Pathway6     A         G           NA         NA            E
Pathway3     A         G           NA         NA            F
Pathway5     A         B           H          NA            E
Pathway2     A         B           H          NA            F
Pathway4     A         B           C          D             E
Pathway1     A         B           C          D             F

我想重新排序上面的数据框(df),以便在蛋白质途径中具有最大相似性的途径(也就是第2列第4列中最大的相似性)彼此相邻排列。

为了更清楚,我希望输出看起来像这样:

{{1}}

怎么会这样做呢?我尝试过各种变体,包括独特的(df),但到目前为止还没有。

此外,虽然按照非NA字符的数量进行排序会对此数据集起作用,但我将分析的实际数据集将有数百个具有相同步骤数量的路径。

2 个答案:

答案 0 :(得分:1)

使用arrange包中的dplyr。它将基于一列或多列对数据框进行排序。您可以按照帖子中的要求使用desc按降序排序:

> dplyr::arrange( df, desc(Protein2), desc(Protein3), desc(Protein4) )

   Beginning1 Protein2 Protein3 Protein4 Biomarker1
 1          A        G     <NA>     <NA>          F
 2          A        G     <NA>     <NA>          E
 3          A        B        H     <NA>          F
 4          A        B        H     <NA>          F
 5          A        B        C        D          F
 6          A        B        C        D          E

请注意,dplyr操作不会保留rownames,因为它们遵循Hadley Wickham的Tidy data definition(简而言之,rownames是不受欢迎的,因为R期望它们是唯一的)。您可以使用rownames_to_column包中的tibble来跟踪您的途径标识符:

> tibble::rownames_to_column( df, "Pathway" ) %>% 
       dplyr::arrange( desc(Protein2), desc(Protein3), desc(Protein4 ) )

    Pathway Beginning1 Protein2 Protein3 Protein4 Biomarker1
 1 Pathway3          A        G     <NA>     <NA>          F
 2 Pathway6          A        G     <NA>     <NA>          E
 3 Pathway2          A        B        H     <NA>          F
 4 Pathway5          A        B        H     <NA>          F
 5 Pathway1          A        B        C        D          F
 6 Pathway4          A        B        C        D          E

如果你需要放回rownames,则有一个等效的tibble::column_to_rownames,但通常建议不要这样做。

答案 1 :(得分:0)

试试这个(顺便说一下:在Biomarker1列中,输入和输出未匹配,我根据我的理解更正了输入df以获得所需的输出。)

df[is.na(df)]=''
df$ALL <- do.call(paste0, df[,2:4])
df=df[order(rev(df$ALL),rev(df$Biomarker1)),]
df[df=='']=NA
df$ALL=NULL
         Beginning1 Protein2 Protein3 Protein4 Biomarker1
Pathway6          A        G     <NA>     <NA>          E
Pathway3          A        G     <NA>     <NA>          F
Pathway2          A        B        H     <NA>          E
Pathway5          A        B        H     <NA>          F
Pathway4          A        B        C        D          E
Pathway1          A        B        C        D          F

输入

df

**

#             Beginning1 Protein2 Protein3 Protein4 Biomarker1
#    Pathway3          A        G     <NA>     <NA>          F
#    Pathway6          A        G     <NA>     <NA>          E
#    Pathway1          A        B        C        D          F
#    Pathway2          A        B        H     <NA>          E
#    Pathway4          A        B        C        D          E
#    Pathway5          A        B        H     <NA>          F

**