我想捕获数据框内的固有值,然后根据每一列和每一行中事件的数量,将列和行从降序升序。
样本数据
#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
我要获得的最终结果是一个按以下层次结构排序的表:
以下是示例输出:
# 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
上的值对列进行排序,但是似乎没有用。
注意:它是针对每个事件,而不仅仅是简单的总和,因此包含了绝对值以计算事件数。
答案 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