Existe uma maneira de calcular a soma (ou média, etc.) de um intervalo de valores definidos para aquela linha em outra coluna?
Aqui estão alguns dados de exemplo:
structure(list(start = c("cmi_apr", "cmi_may", "cmi_may"), end = c("cmi_oct",
"cmi_oct", "cmi_dec"), cmi_jan = c(2.35, 2.24, 37.66), cmi_feb = c(1.33,
5.65, 43.23), cmi_mar = c(0.08, 4.43, 22.2), cmi_apr = c(0.17,
6.48, 18.56), cmi_may = c(-5.61, 0.54, 21.52), cmi_jun = c(-6.37,
-0.92, 13.86), cmi_jul = c(-6.53, 5.18, 2.81), cmi_aug = c(-2.37,
4.4, 21.32), cmi_sep = c(1.28, 0.92, 19.48), cmi_oct = c(0.33,
11.21, 26.43), cmi_nov = c(1.41, 9.18, 43.87), cmi_dec = c(2.21,
10.96, 30.54)), row.names = c(NA, -3L), class = c("tbl_df", "tbl",
"data.frame"))
Quero gerar somas de intervalo com base na variável start
and end
assim:
Eu tenho uma solução, porém meu conjunto de dados real tem mais de 60.000 linhas e demora muito para concluir o cálculo. Imagino que isso deva ser muito mais rápido, já que a adição é vetorizada. Aqui está minha solução atual:
compute_growing_season <- function(df, start_colname, end_colname, FUN) {
# Generate column index vectors
start_idx = sapply(start_colname, function(x) { which(x == names(df))} )
end_idx = sapply(end_colname, function(x) { which(x == names(df))} )
# Generate computed vector
results <- numeric(nrow(df))
for (i in 1:nrow(df)) {
results[i] <- FUN(df[i, start_idx[i]:end_idx[i]], na.rm = F)
}
return(results)
}
output <- sample %>%
mutate(
cmi_growingseason_sum = compute_growing_season(., start, end, sum)
)