Tenho um conjunto de dados em R que se parece com isto:
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))
Quero expandir esse conjunto de dados para ter uma coluna extra chamada "mês" (por exemplo, jan, fev, mar...) ... e quero dividir a diferença entre todos os meses entre trimestres sucessivos para que os números ainda somem entre os trimestres.
Tentei fazer assim:
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)
Essa é a maneira correta de fazer isso? Existe uma maneira mais fácil de fazer isso?
Se você quis dizer que o valor que você dividiu para os meses no total é igual ao valor que você atribuiu no conjunto de dados original, seu código não cria essa solução.
Há muitas, muitas, muitas maneiras de fazer isso.
Esta resposta pressupõe que você queria um valor que, no total, equivalesse ao valor do trimestre. Usei 1/3 do valor do trimestre e o atribuí a cada mês.
Esta solução usa dplyr e tidyr.
Isso é mais rápido e muito mais fácil no R básico:
Se tidyverse:
biblioteca(tidyverse)
Uma abordagem tidyverse baseada nos cálculos feitos em seus for-loops
saída
Se você quiser apenas os valores divididos por trimestre