如何基于变量最大值筛选DataFrame?按月提取鸟类观测最多区域
提取每月鸟类观测数量最多的区域记录
你之前用df %>% group_by(MONTH) %>% max(n)的问题在于,这个写法只会返回每个月份的观测数量最大值,丢失了对应的区域信息和完整行数据。可以用以下两种dplyr的方法实现需求:
方法一:用slice_max直接取每组最大值行
这是dplyr专门用来提取组内最大/最小值行的函数,用法简洁:
library(dplyr) # 提取每个月份中n最大的1行,with_ties=FALSE表示如果有多个相同最大值只保留第一行 result_df <- df %>% group_by(MONTH) %>% slice_max(n, n = 1, with_ties = FALSE) %>% ungroup() # 取消分组,恢复普通数据框格式
如果某个月份有多个区域观测数量相同且都是最大值,想保留所有这些行,把with_ties=FALSE改成with_ties=TRUE即可。
方法二:用filter筛选最大值行
通过筛选每组中观测数量等于该组最大值的行,实现需求:
result_df <- df %>% group_by(MONTH) %>% filter(n == max(n)) %>% ungroup()
这个写法会保留所有符合条件的行,如果只需要每个月份的一行最大值记录,再加一步slice(1):
result_df <- df %>% group_by(MONTH) %>% filter(n == max(n)) %>% slice(1) %>% ungroup()
测试示例
用你提供的测试数据验证:
df <- data.frame( MONTH = c(1,1,2,2,2,3), REGION = c("North(北部)", "South(南部)", "West(西部)", "South(南部)", "East(东部)", "North(北部)"), n = c(12,45,34,23,32,11) )
运行上述任意一种方法,都会得到你想要的结果:
| MONTH | REGION | n |
|---|---|---|
| 1 | South(南部) | 45 |
| 2 | West(西部) | 34 |
| 3 | North(北部) | 11 |
内容的提问来源于stack exchange,提问作者Jjohn
相关产品推荐
相关产品推荐

