R Dataframe 有日期作为一个列名的一部分,我想指定最近的两列,而不是每次都键入它们

5vf7fwbs  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在尝试自动化每周手动运行的报表。我有一个名为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_wide Dataframe 的子集。例如:

p_mover <- p_wide %>% filter(abs(col_2022_09_18 - col_2022_09_25) > .33)

有没有一种方法,我可以指定这两列以上没有手动键入每星期?

gojuced7

gojuced71#

如果列名总是col_yyyy_mm_dd的形式,那么这里有一些代码可以提取日期,找到最后一个和倒数第二个,并将它们与!!一起使用来进行过滤。

library(stringr)
library(dplyr)

p_wide <- read.table(text="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", header = T)

# Get the names of the columns
column_names <- names(p_wide)
# Create a regex to look for dates of the form yyyy_mm_dd
dates_regex <- regex('[0-9]{4}_[0-9]{2}_[0-9]{2}')
# Find the dates
dates <- str_match(string = column_names, dates_regex)[,1] %>% na.omit() 
# Find the last date and make a symbol for use later
last_date_column <- sym(paste0('col_', max(dates)))
# Find the last but one date - again as a symbol
last_date_but_one_column <- sym(paste0('col_', head(tail(dates, 2), 1)))

# Filter using the calculated variables
p_wide %>% filter(abs(!!last_date_but_one_column - !!last_date_column) > .33)

# id col_2022_09_04 col_2022_09_11 col_2022_09_18 col_2022_09_25
# 1  1            0.3            0.8            0.9            0.1
# 2  4            0.1            0.7            0.4            0.9

相关问题