如何自动选取R数据框中含日期列名的最新两列?
问题描述
每周需手动生成报告,希望实现自动化。现有R数据框p_wide,每周会新增一列,列名包含对应日期,示例数据如下:
id col_2022_09_04 col_2022_09_11 col_2022_09_18 col_2022_09_25 --- -------------- -------------- -------------- -------------- 01 0.3 0.8 0.9 0.1 02 0.6 0.1 0.4 0.5 03 0.2 0.1 0.3 0.4 04 0.1 0.7 0.4 0.9
当前手动筛选代码如下:
p_mover <- p_wide %>% filter(abs(col_2022_09_18 - col_2022_09_25) > .33)
需求:无需手动输入列名,自动选取最新的两列完成筛选。
解决方案
方法一:基于列名提取日期(更可靠,不受列顺序影响)
如果列名的日期格式固定为col_YYYY_MM_DD,可以提取日期部分排序,获取最新的两个列名:
library(dplyr) library(stringr) # 提取除id外的所有列名 date_cols <- setdiff(names(p_wide), "id") # 提取日期字符串并转为日期格式,排序后取最新两个 latest_two_cols <- date_cols %>% str_extract("\\d{4}_\\d{2}_\\d{2}") %>% # 提取YYYY_MM_DD格式的日期片段 as.Date(format = "%Y_%m_%d") %>% sort(decreasing = TRUE) %>% head(2) %>% paste0("col_", .) # 还原为完整列名 # 执行筛选 p_mover <- p_wide %>% filter(abs(.data[[latest_two_cols[1]]] - .data[[latest_two_cols[2]]]) > 0.33)
方法二:按列位置取最后两列(简洁,需保证新增列始终在末尾)
如果每周新增的列总是添加在数据框的最后一列,可直接用列位置选取:
library(dplyr) p_mover <- p_wide %>% filter(abs(last_col() - nth(cols(), ncol(.) - 1)) > 0.33)
last_col():选取最后一列(最新的日期列)nth(cols(), ncol(.) - 1):选取倒数第二列(上一周的日期列)
内容的提问来源于stack exchange,提问作者tokay
相关产品推荐
相关产品推荐

