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 %>% 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 %>>% (~ mx = top_n(., 1)) %>% top_n(-1) %>% bind_rows(mx, .)
我试图为您提供一个替代解决方案,让您拥有最小值、最大值和平均值以及标签。如果需要,您可以使用 collect 进行行转换。以上是关于Top_n 返回最大值和最小值 - R的主要内容,如果未能解决你的问题,请参考以下文章