如何从含多日期的DataFrame中筛选最新日期数据?
筛选DataFrame中最新月份的数据
问题背景
我从API下载了一份DataFrame,为实现自动获取最新年月的更新需求,未在API请求列表中指定时间范围,因此返回了所有年月的数据。我仅关注最新月份的条目,已将名为månad的列转换为YYYY-MM-DD格式的Date类型,想找到高效的筛选方法。目前考虑过创建仅含最新日期的新DataFrame再合并,但不确定是否最优。
现有代码
library(pxweb) library(tidyverse) library(lubridate) # PXWEB query - create list pxweb_query_list_BAS <- list("Region"=c("22"), "Kon" =c("1","2"), "Alder" =c( "20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "060-64"), "Fodelseregion" = c("in","ut"), "ContentsCode"=c("000006IJ")) #"Tid" = "2022M09") # Download data using created list px_data_BAS <- pxweb_get(url = "https://api.scb.se/OV0104/v1/doris/sv/ssd/START/AM/AM0210/AM0210A/ArbStatusM", query = pxweb_query_list_BAS) # Convert list to df df_arbetskraftd <- as.data.frame(px_data_BAS, column.name.type = "text", variable.value.type = "text") #Convert class of col. månad from chr (string) to date df_arbetskraftd$månad <- ym(df_arbetskraftd$månad)
最优解决方案
方法1:dplyr直接筛选(推荐)
利用tidyverse中的dplyr包,一步完成筛选,代码简洁且性能最优:
# 筛选出所有对应最新月份的行 df_latest <- df_arbetskraftd %>% filter(månad == max(månad, na.rm = TRUE))
max(månad, na.rm = TRUE)会直接提取månad列的最新日期,filter函数保留所有匹配该日期的记录,无需额外的合并操作,避免冗余步骤。
方法2:Base R实现
如果不依赖tidyverse,用基础R代码也能实现:
# 获取最新日期 latest_month <- max(df_arbetskraftd$månad, na.rm = TRUE) # 筛选对应数据 df_latest <- df_arbetskraftd[df_arbetskraftd$månad == latest_month, ]
不推荐合并方案的原因
创建新DataFrame再合并的方式会增加不必要的数据拼接步骤,代码冗余的同时,还会占用更多内存(尤其当数据量较大时),直接筛选的方法在效率和简洁性上都更优。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

