如何在R(dplyr)中筛选最后和倒数第二个观测值的所有行
筛选数据框中倒数两个月份的行(R语言)
数据框定义
data <- structure(list(Version = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), levels = c("Nov 2022", "Jan 2023", "Mar 2023", "May 2023", "Jul 2023"), class = "factor")), row.names = c(NA, -40L), class = c("tbl_df", "tbl", "data.frame"))
需求
需要动态筛选数据框中最后一个和倒数第二个月份的所有行(本例中对应May 2023和Jul 2023),目前仅能通过last()筛选最后一个月份,需调整代码实现同时筛选两个月份。
解决方案
因为Version是有序因子,可直接利用因子顺序或提取唯一月份值实现动态筛选,以下是几种可行方法:
方法1:结合last()与nth()函数
用nth(Version, n=-2)定位倒数第二个月份,同时匹配最后一个和倒数第二个月份:
library(tidyverse) data %>% filter(Version %in% c(last(Version), nth(Version, n = -2)))
方法2:提取唯一月份后取最后两个
先获取所有唯一的Version值,再取最后两个进行匹配,适配性更强,即使数据中月份有重复也能正确识别:
data %>% filter(Version %in% tail(unique(Version), 2))
方法3:基于因子水平索引
利用因子的水平属性,直接选取最后两个水平:
data %>% filter(Version %in% levels(Version)[tail(seq_along(levels(Version)), 2)])
以上三种方法均无需硬编码月份名称,可动态适配不同的月份数据。
内容的提问来源于stack exchange,提问作者Tanga94
相关产品推荐
相关产品推荐

