Сохранить имя строки как идентификатор с помощью dplyr - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть эти данные с 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
...

Я использую библиотеку 'tidyr' в R, чтобы получить первые 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

Но мне нужно сохранить номер строки в качестве идентификатора, чтобы соответствовать другой информации из другого набора данных, который следует той же структуре. Я имею в виду, что я хочу получить такой результат:

   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

Я знаю, что он может быть немного базовым, но кто-то может помочь?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019
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
0 голосов
/ 01 ноября 2019

Я использую m вместо matrix в качестве имени вашей матрицы, поскольку "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...