вернуть все возможные значения, с которыми .max в R - PullRequest
1 голос
/ 17 февраля 2020

У меня есть следующий набор данных

clust       T2       n
1            a       1
1            b       3
1            c       3
2            d       5
3            a       4 
3            b       3
4            b       5
4            c       8
4            t       6
4            e       7
etc..

с использованием следующей функции:

library(dplyr)
table <- data %>% group_by(clust) %>% summarise(max = max(n), name1 = T2[which.max(n)])

Я получаю этот вывод

clust   max  name1
1        3    b
2        5    d
3        4    a
4        8    c
etc

, однако есть случаи, когда два или более значений T2, соответствующих max (n). как я могу записать эти значения тоже?

т.е.

clust   max  name1
1        3    b,c
2        5    d
3        4    a
4        8    c
etc

или

clust   max  name1
1        3    b
1        3    c
2        5    d
3        4    a
4        8    c
etc

1 Ответ

2 голосов
/ 17 февраля 2020

Мы можем сделать == вместо which.max (который возвращает только первый индекс значения max) и paste вместе с toString

library(dplyr)
library(tidyr)
data %>%
    group_by(clust) %>% 
    summarise(max = max(n), name1 = toString(T2[n == max(n)]))
# A tibble: 4 x 3
#  clust   max name1
#  <int> <int> <chr>
#1     1     3 b, c 
#2     2     5 d    
#3     3     4 a    
#4     4     8 c    

, и это может быть расширен на separate_rows на следующем шаге

data %>%
    group_by(clust) %>% 
    summarise(max = max(n), name1 = toString(T2[n == max(n)])) %>%
    separate_rows(name1, sep=",\\s+")
# A tibble: 5 x 3
#  clust   max name1
#  <int> <int> <chr>
#1     1     3 b    
#2     1     3 c    
#3     2     5 d    
#4     3     4 a    
#5     4     8 c    

Или иметь столбец list и затем unnest

data %>%
    group_by(clust) %>% 
    summarise(max = max(n), name1 = list(T2[n == max(n)]))  %>%
    unnest(c(name1))
# A tibble: 5 x 3
#  clust   max name1
#  <int> <int> <chr>
#1     1     3 b    
#2     1     3 c    
#3     2     5 d    
#4     3     4 a    
#5     4     8 c    

data

data <- structure(list(clust = c(1L, 1L, 1L, 2L, 3L, 3L, 4L, 4L, 4L, 
4L), T2 = c("a", "b", "c", "d", "a", "b", "b", "c", "t", "e"), 
    n = c(1L, 3L, 3L, 5L, 4L, 3L, 5L, 8L, 6L, 7L)),
    class = "data.frame", row.names = c(NA, 
-10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...