我已经获得了20848个条目的数据:
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
1 0.023255814 0.1000000000 0.046511628 0.004651163 0.030232558 0.000000000 0.369767442 0.020930233 0.000000000 0.000000000 0.025581395 0.379069767
2 0.063750000 0.0112500000 0.001250000 0.105000000 0.120000000 0.522500000 0.005000000 0.000000000 0.005000000 0.002500000 0.163750000 0.000000000
3 0.026605505 0.3844036697 0.192660550 0.017431193 0.000000000 0.004587156 0.013761468 0.028440367 0.163302752 0.097247706 0.014678899 0.056880734
...
我正在R中使用'tidyr'库来像这样从每一行中获取前3个V#数字:
gather(as.data.frame(matrix), key = "Name", value = "Prob",factor_key = TRUE) %>%
group_by(Name) %>%
top_n(n = 3)
获得此结果:
Name Prob
<fct> <dbl>
1 V1 0.717
2 V1 0.682
3 V1 0.686
4 V2 0.756
5 V2 0.767
6 V2 0.817
7 V3 0.806
8 V3 0.871
9 V3 0.801
10 V4 0.779
# ... with 26 more rows
但是我需要保留行号作为ID,以匹配来自遵循相同结构的另一个数据集的其他信息。我的意思是我想得到这样的结果:
Name Prob row
<fct> <dbl>
1 V1 0.717 4151
2 V1 0.682 17
3 V1 0.686 3215
4 V2 0.756 17565
5 V2 0.767 13254
6 V2 0.817 3
7 V3 0.806 2135
8 V3 0.871 298
9 V3 0.801 4568
10 V4 0.779 542
# ... with 26 more rows
我知道这可能有点基础,但是请有人可以提供帮助?
我使用m
而不是matrix
作为矩阵名称,因为“矩阵”是R中函数的名称。
此外,pivot_longer()
替换了gather()
中的tidyr
。
您可以在将数据转换为长格式之前使用tibble::rownames_to_column()
(但是您首先需要将矩阵转换为数据框,因为该功能仅适用于数据帧):
m <- as.data.frame(m)
m %>%
tibble::rownames_to_column(var = "Row") %>%
pivot_longer(-Row, names_to = "Name", values_to = "Prob") %>%
group_by(Name) %>%
top_n(n = 3) %>%
select(c(2, 3, 1))
输出:
Name Prob Row
<chr> <dbl> <chr>
1 V1 0.0233 1
2 V2 0.1 1
3 V3 0.0465 1
4 V4 0.00465 1
5 V5 0.0302 1
6 V6 0 1
7 V7 0.370 1
8 V8 0.0209 1
9 V9 0 1
10 V10 0 1
# … with 26 more rows
library(dplyr)
library(tidyr)
library(magrittr)
mat <- matrix(sample(1:24), nrow = 6, ncol = 4,
dimnames = list(NULL, LETTERS[1:4]))
mat
#> A B C D
#> [1,] 11 20 1 3
#> [2,] 16 2 14 18
#> [3,] 13 6 4 23
#> [4,] 5 19 7 15
#> [5,] 10 17 12 22
#> [6,] 9 21 24 8
将行号作为矩阵名(我使用magrittr::set_rownames()
以便可以在管道中完成),然后使用as_tibble()
可靠地保留行名。
mat %>%
set_rownames(seq_len(nrow(.))) %>%
as_tibble(rownames = "row") %>%
pivot_longer(cols = -row, names_to = "Name", values_to = "Prob") %>%
group_by(Name) %>%
top_n(3, Prob) %>%
arrange(Name)
#> # A tibble: 12 x 3
#> # Groups: Name [4]
#> row Name Prob
#> <chr> <chr> <int>
#> 1 1 A 11
#> 2 2 A 16
#> 3 3 A 13
#> 4 1 B 20
#> 5 4 B 19
#> 6 6 B 21
#> 7 2 C 14
#> 8 5 C 12
#> 9 6 C 24
#> 10 2 D 18
#> 11 3 D 23
#> 12 5 D 22