如何在R中为data.frame的id.columns指定特定的日期格式(XYYYYYMM)?

如何在R中为data.frame的id.columns指定特定的日期格式(XYYYYYMM)?,r,R,背景: 我试图根据子集公式筛选大型数据集的列,问题是,我使用的是列的id号,而不是等于日期(此格式为XYYYMM)的列的实际名称,这肯定会在操作id.columns和所需时间范围时给我带来麻烦 数据集的小样本表代码: company <- c("AML Steels Ltd.", "Information Ltd.", "Enterprises Ltd.") X200201 <- c("A","A","F") X200202 <- c("A","B","F

背景:

我试图根据子集公式筛选大型数据集的列,问题是,我使用的是列的id号,而不是等于日期(此格式为XYYYMM)的列的实际名称,这肯定会在操作id.columns和所需时间范围时给我带来麻烦

数据集的小样本表代码:

   company <- c("AML Steels Ltd.", "Information  Ltd.", "Enterprises Ltd.") 
   X200201 <- c("A","A","F")
   X200202 <- c("A","B","F")
   X200203 <- c("C","B","F")
   X200204 <- c("E","F","D")
   X200205 <- c("C","A","F")
   X200206 <- c("A","F","C")

    df <- data.frame(company, X200201, X200202, X200203, X200204, X200205, X200206, stringsAsFactors = F)

这类问题有什么解决方案吗?
子集
过滤行而不是列

要筛选列,可以使用正则表达式匹配要选择的列

例如,要匹配名称以
01
02
03
结尾的列,可以执行以下操作

df[, grep("(01$|02$|03$)", colnames(df))];
#  X200201 X200202 X200203
#1       A       A       C
#2       A       B       B
#3       F       F       F
或者,您可以定义一个函数,该函数将列名转换为带有
as.date
的日期,然后返回特定日期间隔内的列的列索引


更新 让我们定义一个函数,让您以
%Y%m
的形式指定
开始
结束
日期,您可以根据该函数从
df
中选择列

library(zoo);
sel.col <- function(start, end, df) {
    dates <- as.yearmon(sub("X", "", colnames(df)[-1]), "%Y%m");
    start <- as.yearmon(start, "%Y%m");
    end <- as.yearmon(end, "%Y%m");
    which(dates >= start & dates <= end) + 1;
}

子集
筛选行而不是列。难道不能只使用正则表达式来匹配要提取的列吗?例如像这样的
df[,grep((01$| 02$| 03$)”,colnames(df))]
?如果您不熟悉正则表达式,您可以将
dplyr
与例如
df%>%select(contains(“200201”)一起使用
我真的不知道这个公式,你能给我一些见解吗,请@StephanImagine我使用的是一个15年的数据集,每月数据(180个月)…我能选择例如200401到200703吗?你忘记了日期中的X吗?(它给我错误)…顺便说一句,谢谢!如果我想把时间框架转换成data.frame?可能吗?@Robin_Hcp不确定日期中的
X
是什么意思。上面的代码对您提供的样本数据有效,没有任何错误。我也不确定“时间框架”是什么;
df[,sel.col(“200201”,“200203”,df)]
返回一个
data.frame
.Great@Robin\u Hcp;很高兴它有帮助!
library(zoo);
sel.col <- function(start, end, df) {
    dates <- as.yearmon(sub("X", "", colnames(df)[-1]), "%Y%m");
    start <- as.yearmon(start, "%Y%m");
    end <- as.yearmon(end, "%Y%m");
    which(dates >= start & dates <= end) + 1;
}
df[, sel.col("200201", "200203", df)]
#  X200201 X200202 X200203
#1       A       A       C
#2       A       B       B
#3       F       F       F