根据列中的固有值对数据框进行排序

时间:2018-08-09 23:35:56

标签: r sorting dplyr

我想捕获数据框内的固有值,然后根据每一列和每一行中事件的数量,将列和行从降序升序。

样本数据

 #A tibble: 26 x 9
   sample_id Gene_A Gene_B Gene_C Gene_D Gene_E Gene_F Gene_G Gene_H
   <fct>      <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>
 1 A             -1      0      0      0     -1      0      0     -1
 2 B              1      0     -1      1     -1     -1     -1      0
 3 C              1      0     -1      0      1      0      0     -1
 4 D             -1      0      0     -1      1      1     -1      1
 5 E              1      1      1      1     -1      1     -1      0
 6 F             -1     -1      1      1      1     -1      0      0
 7 G              0      0     -1     -1      0     -1      0     -1
 8 H              1      1      1      0      1     -1     -1      0
 9 I              0     -1     -1     -1      0     -1      0      1
10 J             -1      0      0      1     -1     -1      0      1
# ... with 16 more rows

我要获得的最终结果是一个按以下层次结构排序的表:

  • 基于事件最多到事件最少的基因数量
    • 然后,基于每个sample_id的事件数(从大多数事件到最少事件)。

以下是示例输出:

# A tibble: 26 x 9
   sample_id Gene_B Gene_G Gene_H Gene_A Gene_C Gene_D Gene_F Gene_E
 * <chr>      <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>
 1 A              0      0     -1     -1      0      0      0     -1
 2 U              0     -1      0      0      0     -1      0      1
 3 C              0      0     -1      1     -1      0      0      1
 4 G              0      0     -1      0     -1     -1     -1      0
 5 W              0     -1      1      1      0      1      0      0
 6 Y              0      0      1      1      0      1      1      0
 7 I             -1      0      1      0     -1     -1     -1      0
 8 J              0      0      1     -1      0      1     -1     -1
 9 O              0      1      0      0      1     -1      1      1
10 P              1     -1     -1      0     -1      0      0     -1
# ... with 16 more rows

我的第一步虽然是取绝对值总和,然后为每个样本添加一个总计列,然后取绝对值总和,并为每一列添加一个总计列,然后使用顺序。

生成样本数据

dummy.tb <- tibble (sample_id = (sample (1:30,30)), Gene_A = (sample
(-1:1,30, replace = T)), Gene_B = (sample (-1:1,30, replace = T)))

dummy1.tb <- tibble (Gene_C = (sample (-1:1,30, replace = T)), Gene_D
= (sample (-1:1,30, replace = T)), Gene_E = (sample (-1:1,30, replace = T)))

dummy2.tb <- tibble (Gene_F = (sample (-1:1,30, replace = T)), Gene_G
= (sample (-1:1,30, replace = T)), Gene_H = (sample (-1:1,30, replace = T)))

dummy.tb <- cbind.data.frame(dummy.tb, dummy1.tb, dummy2.tb)

dummy.genes <- c ("Gene_A", "Gene_B", "Gene_C", "Gene_D", "Gene_E",
"Gene_F", "Gene_G", "Gene_H")

dummy.total <- as.data.frame (dummy.total)

添加Col_Total和列求和

dummy.total <- dummy.tb %>% bind_rows(summarise_all(., funs(if(is.numeric(.)) sum(abs(.)) else "Col_Total")))

dummy.total <- as.data.frame (dummy.total)

按列排序

dummy.total <- dummy.total [,order(dummy.total[nrow(dummy.total),], decreasing = FALSE)]

删除Col_Total行

dummy.total <- dummy.total %>% filter (!sample_id == "Col_Total")

dummy.total <- as.data.frame (dummy.total)

添加行总计和行总和

dummy.total <- dummy.total %>% mutate (Row_Total = rowSums (abs((select (., one_of(dummy.genes))))))

dummy.total <- as.data.frame (dummy.total)

按行排序

dummy.total <- dummy.total [order (dummy.total [,ncol(dummy.total)], decreasing = FALSE),]

删除Row_Total列

dummy.total <- dummy.total %>% select (-Row_Total)

使用sample_id重新排序

dummy.total <- dummy.total %>% select (sample_id, everything())

dummy.total <- as.tibble(dummy.total)

此代码确实可以工作并提供所需的输出,但是在此过程中,由于结构上的许多更改,它似乎太冗长。有使用tidyverse或其他方法的建议吗?我尝试使用arrange ()而不是根据Col_Total上的值对列进行排序,但是似乎没有用。

注意:它是针对每个事件,而不仅仅是简单的总和,因此包含了绝对值以计算事件数。

1 个答案:

答案 0 :(得分:1)

对于此问题,IF EXISTS (SELECT * FROM pets WHERE type = "cat") THEN SELECT * FROM pets WHERE condition = "cat" LIMIT 1 -- etc... down the ranking 更适合您处理同类(数字)数据的情况。如果您将列名和matrix分配给sample_id的{​​{1}},则可以在排序后保留列标识符和行标识符。

我建议您使用dimnames,以便您的示例可以重现,并且可以用所需的输出来验证答案。

请参见以下内容:

matrix

输出:

set.seed