简体   繁体   English

将月度数据与季度数据合并?

[英]Merging monthly level data with quarterly data?

I have 2 data sets - one is quarterly which I need to match to monthly data.我有 2 个数据集 - 一个是季度数据,我需要与月度数据相匹配。 So the values from the quarterly data will be repeated thrice in the final data set.因此,季度数据中的值将在最终数据集中重复三次。 I have created a one quarter sample below but this would need to be repeated for many quarters.我在下面创建了一个四分之一的样本,但这需要重复很多个季度。

month <- c(1/20, 2/20, 3/20)
rating <- c(0.5,0.6,0.65)
df1 <- cbind(month,rating)

quarter <- c(“q1/20”)
amount <- c(100)
df2 <- cbind(quarter,amount)

My final data set should have the following structure我的最终数据集应该具有以下结构


month <- c(1/20, 2/20, 3/20)
rating <- c(0.5,0.6,0.65)
quarter <- c(“q1/20”, “q1/20”, “q1/20”)
amount <- c(100,100,100)

df3 <- cbind(month, rating, quarter, amount)

In the full quarterly data set (df1), some observations are also monthly so it would maybe be a case of matching the monthly observations by month and quarterly observations by quarter?在完整的季度数据集(df1)中,一些观察也是每月的,所以可能是按月匹配每月观察和按季度匹配季度观察的情况?

Thanks in anticipation.感谢期待。

Assuming you have this data.假设你有这些数据。

head(m.dat)
#   month rating
# 1  1/18   0.91
# 2  2/18   0.94
# 3  3/18   0.29
# 4  4/18   0.83
# 5  5/18   0.64
# 6  6/18   0.52

head(q.dat)
#   quarter amount
# 1   q1/18      1
# 2   q2/18     21
# 3   q3/18     91
# 4   q4/18     61
# 5   q1/19     38
# 6   q2/19     44

You could match month information to quarters using an assignment matrix qm .您可以使用分配矩阵qm将月份信息与季度匹配。

qm <- matrix(c(1:12, paste0("q", rep(1:4, each=3))), 12, 2)
m.dat$quarter <- paste0(qm[match(qm[, 1], gsub("(^\\d*).*", "\\1", m.dat$month)), 2], 
                        "/",
                        sapply(strsplit(m.dat$month, "/"), `[`, 2))

This enables you to use merge .这使您能够使用merge

res <- merge(m.dat, q.dat, all=TRUE)
head(res)
#   quarter month rating amount
# 1   q1/18  1/18   0.91      1
# 2   q1/18  2/18   0.94      1
# 3   q1/18  3/18   0.29      1
# 4   q1/19  1/19   0.93     38
# 5   q1/19  2/19   0.26     38
# 6   q1/19  3/19   0.46     38

Toy data玩具数据

m.dat <- structure(list(month = c("1/18", "2/18", "3/18", "4/18", "5/18", 
"6/18", "7/18", "8/18", "9/18", "10/18", "11/18", "12/18", "1/19", 
"2/19", "3/19", "4/19", "5/19", "6/19", "7/19", "8/19", "9/19", 
"10/19", "11/19", "12/19", "1/20", "2/20", "3/20", "4/20", "5/20", 
"6/20", "7/20", "8/20", "9/20", "10/20", "11/20", "12/20"), rating = c(0.91, 
0.94, 0.29, 0.83, 0.64, 0.52, 0.74, 0.13, 0.66, 0.71, 0.46, 0.72, 
0.93, 0.26, 0.46, 0.94, 0.98, 0.12, 0.47, 0.56, 0.9, 0.14, 0.99, 
0.95, 0.08, 0.51, 0.39, 0.91, 0.45, 0.84, 0.74, 0.81, 0.39, 0.69, 
0, 0.83)), class = "data.frame", row.names = c(NA, -36L))

q.dat <- structure(list(quarter = c("q1/18", "q2/18", "q3/18", "q4/18", 
"q1/19", "q2/19", "q3/19", "q4/19", "q1/20", "q2/20", "q3/20", 
"q4/20"), amount = c(1, 21, 91, 61, 38, 44, 4, 97, 43, 96, 89, 
64)), class = "data.frame", row.names = c(NA, -12L))

Assuming that df1 and df2 are the data frames shown in the Note at the end create a yq column of class yearqtr in each and merge on that:假设 df1 和 df2 是最后注释中显示的数据框,在每个中创建一个 class yearqtr 的 yq 列并在其上合并:

library(zoo)   

df1 <- transform(df1, yq = as.yearqtr(month, "%m/%y"))
df2 <- transform(df2, yq = as.yearqtr(quarter, "q%q/%y"))

merge(df1, df2, by = "yq", all = TRUE)

giving:给予:

       yq month rating quarter amount
1 2020 Q1  1/20   0.50   q1/20    100
2 2020 Q1  2/20   0.60   q1/20    100
3 2020 Q1  3/20   0.65   q1/20    100

We could also consider converting the month column into a yearmon class column using as.yearmon .我们还可以考虑使用as.yearmon将月份列转换为 yearmon class 列。

Note笔记

df1 <- data.frame(month = c("1/20", "2/20", "3/20"), rating = c(0.5,0.6,0.65))
df2 <- data.frame(quarter = "q1/20", amount = 100)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM