R - 如何将季度列转换为日期?

R - How to convert column of quarters to dates?

我有一个 csv,其中包含“Period”(四分之一)和“Percent”。将数据读入 R 后,“Period”列为“chr”,“Percent”列为“num”。我想将季度值更改为日期,因此:

for (i in 1:length(sloos_tighten$Period)) {
    sloos_tighten$Period[i] <- paste("Q", substring(sloos_tighten$Period[i], 6), "/", substring(sloos_tighten$Period[i], 1, 4),  sep = "")
    sloos_tighten$Period[i] <- as.Date(as.yearqtr(sloos_tighten$Period[i], format = "Q%q/%Y"))
} 

for 循环中的第一行将季度格式更改为 as.yearqtr 可读,第二行将季度更改为日期。第一行按预期工作,但第二行将日期转换为四位数。我认为这是因为“Period”是“chr”类型,但我不知道如何将其更改为日期。我试图创建一个日期类型的新列,但我找不到任何在线资源来解释它。任何帮助表示赞赏。提前致谢。

> dput(head(sloos_tighten, 10))
structure(list(Period = c("1990:2", "1990:3", "1990:4", "1991:1", 
"1991:2", "1991:3", "1991:4", "1992:1", "1992:2", "1992:3"), 
    `Large and medium` = c(54.4, 46.7, 54.2, 38.6, 20, 18.6, 
    16.7, 10, 3.5, -3.4), Small = c(52.7, 33.9, 40.7, 31.6, 6.9, 
    8.8, 7, 0, -7.1, -1.7)), row.names = c(NA, 10L), class = "data.frame")

^数据导入后的样子

从某种意义上说,文字 for 循环很好,但不幸的是这里有两个问题:

  1. 这里有一个 class 问题:如果 $Period 是一个字符串,那么当你用 Date [=44] 的东西重新分配它的一个值时=],然后将日期转换为字符串。这是因为在 R data.frame 中,除了少数例外,列中的所有值都必须是同一类型。这是因为列(几乎总是)是一个 向量 ,并且 R 将向量视为同质的。

    您可以通过预先分配一个 Date 类型的向量并逐个分配它来解决这个问题:

    newdate <- rep(Sys.Date()[NA], nrow(sloos_tighten)) # just to get the class right
    for (i in 1:length(sloos_tighten$Period)) {
      tmp <- paste("Q", substring(sloos_tighten$Period[i], 6), "/", substring(sloos_tighten$Period[i], 1, 4),  sep = "")
      newdate[i] <- as.Date(as.yearqtr(tmp, format = "Q%q/%Y"))
    }
    

    (但请不要使用此代码,请先查看下面的#2。)

  2. 本身不是问题,而是效率问题:R 擅长将事情作为一个整体向量来处理。如果一步重新分配所有 $Period,那么一切都会更快。

    sloos_tighten$Period <- 
      as.Date(
        paste0(substring(sloos_tighten$Period, 6),
               "/", substring(sloos_tighten$Period, 1, 4)),
        format = "%q/%Y")
    

    这从 paste(.., sep="") 切换到 paste0,一个方便的功能。然后,它删除了前导 "Q" 因为我们真的没有保留它,所以为什么要添加它(除了声明性代码)。最后,它一次处理整个字符串向量。

(这是未见过的数据,因此未经测试。)