суммировать данные для нескольких переменных data.frame в r? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь вычислить верхний и нижний quartile из двух variables в моем data.frame за период времени, который меня интересует. Код ниже дал мне один ди git для верхнего и нижнего значения.

    set.seed(50)
FakeData <- data.frame(seq(as.Date("2001-01-01"), to= as.Date("2003-12-31"), by="day"),
                     A = runif(1095, 0,10),
                     D = runif(1095,5,15))
    colnames(FakeData) <- c("Date", "A","D")
    statistics <- FakeData %>% 
              gather(-Date, key = "Variable", value = "Value") %>% 
              mutate(Year = year(Date), Month = month(Date)) %>% 
              filter(between(Month,3,5)) %>% 
              mutate(NewDate = ymd(paste("2020", Month,day(Date), sep = "-"))) %>%
              group_by(Variable, NewDate) %>%
              summarise(Upper = quantile(Value,0.75, na.rm = T),
                        Lower = quantile(Value, 0.25, na.rm = T))

Я бы хотел вывод, как показано ниже (Final_output - это то, что меня интересует)

Output1 <- data.frame(seq(as.Date("2000-03-01"), to= as.Date("2000-05-31"), by="day"),
                       Upper = runif(92, 0,10), lower = runif(92,5,15), Variable = rep("A",92))
colnames(Output1)[1] <- "Date"
Output2 <- data.frame(seq(as.Date("2000-03-01"), to= as.Date("2000-05-31"), by="day"),
                      Upper = runif(92, 2,10), lower = runif(92,5,15), Variable = rep("D",92))
colnames(Output2)[1] <- "Date"
Final_Output<- bind_rows(Output1,Output2)

1 Ответ

1 голос
/ 31 марта 2020

Я могу предложить вам data.table решение. Фактически, есть несколько способов сделать это.

Последние шаги (применить квартиль по группе к переменной Value) можно перевести в (если вы хотите, как в вашем примере, два столбца):

statistics[,.('p25' = quantile(get('Value'), probs = 0.25), 'p75' = quantile(get('Value'), probs = 0.75)),
           by = c("Variable", "NewDate")]

Если вы предпочитаете вывод в длинном формате:

library(data.table)
setDT(statistics)

statistics[,.(lapply(get('Value'), quantile, probs = .25,.75)) ,
by = c("Variable", "NewDate")]

Все шаги вместе

Возможно, будет лучше, если вы решите использовать data.table, чтобы выполнить все шаги, используя data.table глаголы. Я предполагаю, что ваши данные имеют структуру, аналогичную сгенерированному и упорядоченному фрейму данных, т.е.

statistics <- FakeData %>% 
  gather(-Date, key = "Variable", value = "Value") 

В этом случае шаги mutate и filter станут

statistics[,`:=`(Year = year(Date), Month = month(Date))]
statistics <- statistics[Month %between% c(3,5)]
statistics[, NewDate = :ymd(paste("2020", Month,day(Date), sep = "-"))]

И выберите последний шаг, который вы предпочитаете, например,

statistics[,.('p25' = quantile(get('Value'), probs = 0.25), 'p75' = quantile(get('Value'), probs = 0.75)),
           by = c("Variable", "NewDate")]
...