【问题标题】:How to sort and order a dataframe by the similarity of its rows如何根据行的相似性对数据框进行排序和排序
【发布时间】:2017-06-28 14:37:49
【问题描述】:
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            F
Pathway4     A         B           C          D             E
Pathway5     A         B           H          NA            F

我想对上述数据框 (df) 重新排序,以便在其蛋白质通路中具有最大相似性的通路(也就是 2:4 列中的最大相似性)彼此相邻排序。

为了更清楚,我希望输出如下所示:

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

如何去做呢?我尝试了包括 unique(df) 在内的变体,但到目前为止都没有奏效。

此外,虽然仅按非 NA 字符的数量排序适用于该数据集,但我将分析的实际数据集将包含数百个具有相同步数的路径。

【问题讨论】:

  • 不要发布数据图片。将您的数据保存在reproducible format
  • 谢谢!我是 Stack Overflow 的新手,不知道如何在问题中输入我的数据框。
  • 虽然不是在所有情况下都有效,但您可以使用基本 R order 函数对数据进行排序:例如 df[with(df, order(Beginning1, Protein2, Protein3, Protein4)),]

标签: r dataframe unique


【解决方案1】:

使用dplyr 包中的arrange。它将根据一列或多列对数据框进行排序。您可以按照帖子中的要求使用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 操作不保留行名,因为它们遵循 Hadley Wickham 的Tidy data definition(简而言之,行名是不可取的,因为R 期望它们是唯一的)。您可以使用 tibble 包中的 rownames_to_column 来跟踪您的路径标识符:

> 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

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

【讨论】:

  • 谢谢!这适用于我较小的数据集。我将尝试使用我更大、更复杂的数据集并回复您!
  • 我一定会考虑安排的,@Wen!
【解决方案2】:

试试这个(顺便说一句:在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

**

【讨论】:

  • 你的意思是我的或 Artem Sokolov 的解决方案
  • 您的两个解决方案都有效。它们与我较大的数据框给出的输出略有不同,但两种输出都增加了数据框的组织,这正是我想要的。
猜你喜欢
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多