фрейм данных, выбирая вершину путем группировки - PullRequest
0 голосов
/ 14 мая 2018

У меня есть фрейм данных, например:

set.seed(1)
df <- data.frame(
  sample = 1:50,
  value = runif(50),
  group = c(rep(NA, 20), gl(3, 10)))

Я хочу выбрать 10 лучших выборок на основе значения.Однако, если есть группа, соответствующая образцу, я хочу включить только один образец из этой группы.Если группа == NA, я хочу включить все из них.Расположение df по значению выглядит следующим образом:

df_top <- df %>% 
  arrange(-value) %>% 
  top_n(10, value)

   sample     value group
1      46 0.7973088     3
2      49 0.8108702     3
3      22 0.8394404     1
4       2 0.8612095    NA
5      27 0.8643395     1
6      20 0.8753213    NA
7      44 0.8762692     3
8      26 0.8921983     1
9      11 0.9128759    NA
10     30 0.9606180     1

Я бы хотел включить в мой кадр данных сэмплы 36, 22, 2, 20, 11 и следующие пять самых высоких значений, которые продолжают соответствовать шаблону.Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Аналогичный метод, который использует slice вместо filter:

library(dplyr)

df_top <- df %>%
  arrange(-value) %>%
  group_by(group) %>%
  slice(if(any(!is.na(group))) 1 else 1:n()) %>%
  ungroup() %>%
  top_n(10, value)

Результат:

# A tibble: 10 x 3
   sample     value group
    <int>     <dbl> <int>
 1     21 0.9347052     1
 2     35 0.8273733     2
 3     41 0.8209463     3
 4     18 0.9919061    NA
 5      7 0.9446753    NA
 6      4 0.9082078    NA
 7      6 0.8983897    NA
 8     20 0.7774452    NA
 9     15 0.7698414    NA
10     17 0.7176185    NA
0 голосов
/ 14 мая 2018

Я думаю, я понял это. Будет ли это лучшим способом:

df_top <- df %>% 
  arrange(-value) %>% 
  group_by(group) %>% 
  filter(ifelse(!is.na(group), value == max(value), value == value)) %>% 
  ungroup() %>%
  top_n(10, value)

# A tibble: 10 x 3
   sample value group
    <int> <dbl> <int>
 1     18 0.992    NA
 2      7 0.945    NA
 3     21 0.935     1
 4      4 0.908    NA
 5      6 0.898    NA
 6     35 0.827     2
 7     41 0.821     3
 8     20 0.777    NA
 9     15 0.770    NA
10     17 0.718    NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...