我在 R 中有一个如下所示的数据集:
data = structure(list(quarter = c("Q1 2005", "Q2 2005", "Q3 2005", "Q4 2005",
"Q1 2006"), value = c(128.76, 178.83, 140.9, 188.3, 194.05)), class = "data.frame", row.names = c(NA,
-5L))
我想扩展这个数据集,添加一个名为“月份”的额外列(例如一月、二月、三月……)...并且我想将差额分割到连续季度之间的所有月份,以便各个季度之间的数字仍然相加。
我尝试这样做:
library(dplyr)
expand_dataset <- function(data) {
quarter_to_months <- list(
"Q1" = c("Jan", "Feb", "Mar"),
"Q2" = c("Apr", "May", "Jun"),
"Q3" = c("Jul", "Aug", "Sep"),
"Q4" = c("Oct", "Nov", "Dec")
)
expanded_data <- data.frame()
for (i in 1:(nrow(data) - 1)) {
current_value <- data$value[i]
next_value <- data$value[i + 1]
diff <- (next_value - current_value) / 3
quarter <- substr(data$quarter[i], 1, 2)
year <- substr(data$quarter[i], 4, 7)
months <- quarter_to_months[[quarter]]
for (j in 1:3) {
month_value <- current_value + (j - 1) * diff
expanded_data <- rbind(expanded_data, data.frame(
quarter = data$quarter[i],
month = months[j],
year = year,
value = month_value
))
}
}
return(expanded_data)
}
expanded_data <- expand_dataset(data)
print(expanded_data)
这是正确的做法吗?有没有更简单的方法?
如果您的意思是按月份分割的总值等于您在原始数据集中分配的值,那么您的代码就不会创建该解决方案。
有很多很多方法可以实现这一点。
这个答案假设你想要一个值,总的来说,等于该季度的值。我使用了季度值的 1/3 并将其分配给每个月。
该解决方案使用 dplyr 和 tidyr。
在基础 R 中这更快也更容易:
如果是 tidyverse:
图书馆(tidyverse)
基于 for 循环中的计算的 tidyverse 方法
输出
如果你只想要每季度的分割值