Top_n возвращает максимальное и минимальное значение - R - PullRequest
4 голосов
/ 24 января 2020

Может ли команда top_n () одновременно возвращать максимальное и минимальное значения?

Используя пример со справочной страницы https://dplyr.tidyverse.org/reference/top_n.html

Я попробовал следующее

df <- data.frame(x = c(10, 4, 1, 6, 3, 1, 1)) 
df %>% top_n(c(1,-1)) ## returns an error

df <- data.frame(x = c(10, 4, 1, 6, 3, 1, 1)) 
df %>% top_n(1) %>%  top_n(-1) ## returns only max value

Спасибо

Ответы [ 4 ]

5 голосов
/ 24 января 2020

На самом деле не включает top_n(), но вы можете попробовать:

df %>%
 arrange(x) %>%
 slice(c(1, n()))

   x
1  1
2 10

Или:

df %>%
 slice(which(x == max(x) | x == min(x))) %>%
 distinct()

Или (предоставлено @Gregor):

df %>%
 slice(c(which.min(x), which.max(x)))
2 голосов
/ 24 января 2020

Идея похожа на ответ @ Jakub с purrr::map_dfr

library(tidyverse) # dplyr and purrrr for map_dfr

df %>% 
  map_dfr(c(1, -1), top_n, wt = x, x = .)
#    x
# 1 10
# 2  1
# 3  1
# 4  1
2 голосов
/ 24 января 2020

Вот вариант с top_n, где мы передаем логический вектор на основе, который возвращает TRUE для минимума / максимума, используя range, а затем получаем строки distinct, поскольку есть связи для диапазона, т.е. присутствуют повторяющиеся элементы

library(dplyr)
df %>% 
   top_n(x %in% range(x), 1) %>%
   distinct
#   x
#1 10
#2  1
1 голос
/ 24 января 2020

Мне нравится ответ @ tmfmnk. Если вы хотите использовать функцию top_n, вы можете сделать это:

df <- data.frame(x = c(10, 4, 1, 6, 3, 1, 1))

bind_rows(
  df %>% top_n(1),
  df %>% top_n(-1)
)

# this solution addresses the specification in comments
df %>%
  group_by(y) %>%
  summarise(min = min(x),
            max = max(x),
            average = mean(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...