dat <- data.frame(yearID = rep(1:10000, each = 12),
monthID = rep(1:12, times = 10000),
x1 = rnorm(120000),
x2 = rnorm(120000),
x3 = rnorm(120000),
x4 = rnorm(120000),
x5 = rnorm(120000),
x6 = rnorm(120000),
p.start = 6,
p.end = 7,
m.start = 8,
m.end = 9,
h.start = 10,
h.end = 11)
Мне нужно выполнить некоторые операции над вышеуказанными данными, которые описаны ниже после моего текущего решения
library(dplyr)
start_time <- Sys.time()
df1 <- dat %>%
tidyr::gather(., index_name, value, x1:x6) %>%
dplyr::filter(!index_name %in% c('x5','x6')) %>%
dplyr::group_by(yearID, index_name) %>%
dplyr::summarise(p.start.val = sum(value[monthID == p.start]),
p.val = sum(value[monthID >= p.start & monthID <= p.end]),
m.val = sum(value[monthID >= m.start & monthID <= m.end]),
h.val = sum(value[monthID >= h.start & monthID <= h.end]),
h.end.val = sum(value[monthID == h.end])) %>%
tidyr::gather(., variable, value, p.start.val:h.end.val) %>%
dplyr::mutate(new.col.name = paste0(index_name,'_',variable)) %>%
dplyr::select(-index_name, -variable) %>%
tidyr::spread(., new.col.name, value) %>%
dplyr::mutate(yearRef = 2018)
colnames(df1) <- sub(".val", "", colnames(df1))
df2 <- dat %>%
tidyr::gather(., index_name, value, x1:x6) %>%
dplyr::filter(index_name %in% c('x4','x6')) %>%
dplyr::group_by(yearID, index_name) %>%
dplyr::summarise(p.end.val = value[monthID == p.end],
m.end.val = value[monthID == m.end],
h.end.val = value[monthID == h.end]) %>%
tidyr::gather(., variable, value, p.end.val:h.end.val) %>%
dplyr::mutate(new.col.name = paste0(index_name,'_',variable)) %>%
dplyr::select(-index_name, -variable) %>%
tidyr::spread(., new.col.name, value) %>%
dplyr::mutate(yearRef = 2018)
colnames(df2) <- sub(".val", "", colnames(df2))
final.dat <- Reduce(function(...) merge(..., by = c( "yearID", "yearRef"), all.x=TRUE), list(df1,df2))
end_time <- Sys.time()
end_time - start_time
# Time difference of 2.054761 secs
Что я хочу сделать:
для переменной x1
до x4
, я хочу суммировать их за разные месяцы, как показано в df1
для переменной x5
до x6
, я хочу чтобы выбрать значения для выбранного месяца для каждого года, как показано в df2
Мой код выше работает нормально, но занимает много времени, если размер dat
увеличивается, т.е. если число годы становятся 20000 вместо 10000. Мне интересно, может ли кто-нибудь помочь мне с data.table
для реализации вышеуказанного решения, которое, я надеюсь, сделает это быстрее. Спасибо.