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
循环很好,但不幸的是这里有两个问题:
这里有一个 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。)
本身不是问题,而是效率问题: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"
因为我们真的没有保留它,所以为什么要添加它(除了声明性代码)。最后,它一次处理整个字符串向量。
(这是未见过的数据,因此未经测试。)
我有一个 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
循环很好,但不幸的是这里有两个问题:
这里有一个
class
问题:如果$Period
是一个字符串,那么当你用Date
[=44] 的东西重新分配它的一个值时=],然后将日期转换为字符串。这是因为在 Rdata.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。)
本身不是问题,而是效率问题: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"
因为我们真的没有保留它,所以为什么要添加它(除了声明性代码)。最后,它一次处理整个字符串向量。
(这是未见过的数据,因此未经测试。)