Объединение данных ежемесячного уровня с квартальными данными? - PullRequest
1 голос
/ 03 августа 2020

У меня есть 2 набора данных - один квартальный, который мне нужно сопоставить с ежемесячными данными. Таким образом, значения из квартальных данных будут повторяться трижды в окончательном наборе данных. Я создал образец за один квартал ниже, но его нужно будет повторять в течение многих кварталов.

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)

Мой окончательный набор данных должен иметь следующую структуру


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)

В полном объеме за квартал набор данных (df1), некоторые наблюдения также являются ежемесячными, так что, возможно, это будет случай сопоставления ежемесячных наблюдений по месяцам и квартальных наблюдений по кварталам?

Заранее благодарим.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Предполагая, что df1 и df2 являются фреймами данных, показанными в примечании в конце, создайте столбец yq класса yearqtr в каждом и объедините его:

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)

, получив:

       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

Мы также могли бы рассмотреть возможность преобразования столбца месяца в столбец класса yearmon, используя as.yearmon.

Примечание

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)
0 голосов
/ 03 августа 2020

Предполагая, что у вас есть эти данные.

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

Вы можете сопоставить информацию о месяце с кварталами, используя матрицу присваивания 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))

Это позволяет вам использовать 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

Данные игрушки

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...