Top_n 返回最大值和最小值 - R

Posted

技术标签:

【中文标题】Top_n 返回最大值和最小值 - R【英文标题】:Top_n return both max and min value - R 【发布时间】:2020-01-23 21:43:34 【问题描述】:

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

谢谢

【问题讨论】:

为什么不能使用summarise(max_x = max(x), min_x = min(x)) 【参考方案1】:

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

【讨论】:

类似,df %&gt;% slice(which.max(x), which.min(x)) 表示您不需要distinct。 (虽然它没有给你省略distinct的选项) @Gregor - 让莫妮卡恢复正常,谢谢 :)【参考方案2】:

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

【讨论】:

【参考方案3】:

这是top_n 的一个选项,其中我们传递一个基于逻辑向量,使用range 为最小值/最大值返回TRUE,然后获取distinct 行,因为范围存在关联,即存在重复元素

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

【讨论】:

【参考方案4】:

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

【讨论】:

感谢您的所有回答!事实上,我的数据集有点复杂,例如 df % group_by(y) %>% summarise(average = mean(x)) 我想得到最大值和平均值以及它所属的组的适当标签,它适用于您的解决方案 也可以用pipeR稍作改动,即df %&gt;&gt;% (~ mx = top_n(., 1)) %&gt;% top_n(-1) %&gt;% bind_rows(mx, .) 我试图为您提供一个替代解决方案,让您拥有最小值、最大值和平均值以及标签。如果需要,您可以使用 collect 进行行转换。

以上是关于Top_n 返回最大值和最小值 - R的主要内容,如果未能解决你的问题,请参考以下文章

r 中数据集的最大值和最小值

如何在 r 中绘制最小值、最大值和平均值

Java泛型,返回数组最大值最小值

R中具有数据框的每一行的最小值和最大值

R中数据集中具有最小值和最大值的列名

尝试返回数组的最小值、最大值和平均值