Top_n return 最大值和最小值 - R

Top_n return both max and min value - R

top_n() 命令是否可以同时 return 最大值和最小值?

使用参考页中的示例 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

谢谢

不涉及 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)))

这是一个带有 top_n 的选项,我们传递一个基于 returns TRUE for min/max 使用 range 的逻辑向量,然后得到 distinct行,因为范围有联系,即存在重复元素

library(dplyr)
df %>% 
   top_n(x %in% range(x), 1) %>%
   distinct
#   x
#1 10
#2  1

我喜欢@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))

想法类似于@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