将行名称保留为dplyr的ID

问题描述 投票:0回答:2

我已经获得了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

我知道这可能有点基础,但是请有人可以提供帮助?

r tidyr id
2个回答
0
投票

我使用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

0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.