Hola,
SÃ, he cambiado de forma de hacerlo, asà lo tienes directo en un
data.table...
Y sale el 2000 que no sé porqué no salÃa antes.
#---------------------------------
library(readxl)
library(data.table)
library(tidytable)
library(lubridate)
datos <- read_excel("PPT.xlsx") %>%
as.data.table() %>%
rename.(fecha = Fecha) %>%
mutate.( year = as.factor(year(ymd(fecha)) )) %>%
select.(-fecha) %>%
as.data.table()
# Crear vectores con nombres de columnas y factores
cols_to_sum <- datos %>% select.(where(is.numeric)) %>% names()
resultado <- datos[, lapply(.SD, function(x) sum(x, na.rm = TRUE )),
.SDcols = cols_to_sum, by = year]
#--------------------------------
Saludos,
Carlos Ortega
www.qualityexcellence.es
El mié, 18 ene 2023 a las 23:57, David Camilo Gomez Medina (<
dcgomezme en unal.edu.co>) escribió:
Hola Carlos, muchÃsimas gracias. Me sirvió muchÃsimo y me hiciste caer en
cuenta en que es mejor dejarlo en un dataframe y no en lista. Estoy
iniciando en esto porque manejar ese volumen de datos en Excel es muy
tedioso.
Seguà tu código y lo apliqué, pero mira que no me está dando la suma de
manera correcta y también no me aparece el año 2000 y 2020. Adjunto una
captura del resultado, de cómo apliqué el código y también el archivo con
el que estoy trabajando.
library(readxl)
library(tidyverse)
ppt <- read_excel("PPT.xlsx")
ppt <- transform(ppt, Fecha = as.Date(Fecha))
ppt$year <- as.integer(format(as.Date(ppt$Fecha), "%Y"))
result <- aggregate(. ~ year, data = ppt[, -1], sum, na.rm = T)
Saludos,
[image: image.png]
On Wed, 18 Jan 2023 at 16:10, Carlos Ortega <cof en qualityexcellence.es>
wrote:
Hola,
De esta forma se aproxima bastante a lo que quieres...
#-----------------------------------------------------
#--- Generar datos de forma sintética.
library(dplyr)
# número de sitios
N <- 5
# número de fechas
num_dates <- 365
# generar fechas para 2019, 2021 y 2022
dates_2019 <- seq(as.Date("2019-01-01"), as.Date("2019-12-31"), by =
"day")
dates_2021 <- seq(as.Date("2021-01-01"), as.Date("2021-12-31"), by =
"day")
dates_2022 <- seq(as.Date("2022-01-01"), as.Date("2022-12-31"), by =
"day")
dates <-
c(rep(dates_2019,num_dates),rep(dates_2021,num_dates),rep(dates_2022,num_dates))
# generar nombres de columnas
colnames <- c("fecha", paste0("Sitio_", 1:N))
# generar dataframe vacÃo
df <- data.frame(matrix(nrow = length(dates), ncol = N + 1))
colnames(df) <- colnames
df$fecha <- dates
# generar valores aleatorios
for (i in 2:(N + 1)) {
df[,i] <- rnorm(length(dates), mean = 50, sd = 10)
}
#----- Cálculo como dataframe.
df$year <- as.integer(format(as.Date(df$fecha), "%Y"))
result <- aggregate(. ~ year, data=df[, -1], sum)
#----- Como lista...
result_list <- list()
# Aplicar aggregate() a cada columna de sitio
agg_list <- lapply(df[,-1], function(x) aggregate(x ~ year, data =
df[,-1], sum))
# Aplicar split() a cada elemento de la lista de aggregate()
result_list <- lapply(agg_list, function(x) split(x, x$year))
Saludos,
Carlos Ortega
www.qualityexcellence.es
El mié, 18 ene 2023 a las 20:14, David Camilo Gomez Medina (<
dcgomezme en unal.edu.co>) escribió:
No sé si olvidé aclarar, pero quiero crear una lista para cada columna
y asà almacenar esos valores.
On Wed, 18 Jan 2023 at 14:13, David Camilo Gomez Medina <
dcgomezme en unal.edu.co> wrote:
Hola Carlos.
Por ejemplo la segunda columna (16040050), quiero sumar todos los
datos de esa columna correspondientes al año 2000 (quiero relacionarlos con
la primera columna donde está la fecha) y ese valor almacenarlo en una
lista y asà sucesivamente con los demás años y con las demás columnas.
Tengo pensado una lista asÃ:
est_16040050
[[2000]]
[1] 2.3
[[2001]]
[1] 1.7
[[2002]]
[1] 4.8
Quedo muy atento a sus sugerencias o guÃas.
Saludos.
On Wed, 18 Jan 2023 at 13:52, Carlos Ortega <cof en qualityexcellence.es>
wrote:
Hola,
Por entenderlo mejor, quieres que para las filas, para cada año:
1. se sumen las columnas y por tanto tengas tantas sumas como
columnas.
2. o sumar todas las columnas y obtener una única suma.
Gracias,
Carlos Ortega
www.qualityexcellence.es
El mié, 18 ene 2023 a las 19:29, David Camilo Gomez Medina (<
dcgomezme en unal.edu.co>) escribió:
Hola, espero que se encuentren muy bien.
Tengo una tabla de datos de precipitación y quiero sumar por
columnas y asà obtener la precipitación anual. Es decir, quiero sumar solo
los datos del año 2000 y guardarlos en una lista y asà sucesivamente con
los demás años, pero no encuentro todavÃa una función o una manera
eficiente de hacerlo.
AgradecerÃa mucho si alguien me puede guiar.
Saludos
[image: image.png]
*Aviso legal:* El contenido de este mensaje y los archivos adjuntos
son confidenciales y de uso exclusivo de la Universidad Nacional de
Colombia. Se encuentran dirigidos sólo para el uso del destinatario al cual
van enviados. La reproducción, lectura y/o copia se encuentran prohibidas a
cualquier persona diferente a este y puede ser ilegal. Si usted lo ha
recibido por error, infórmenos y elimÃnelo de su correo. Los Datos
Personales serán tratados conforme a la Ley 1581 de 2012 y a nuestra
PolÃtica de Datos Personales que podrá consultar en la página web
www.unal.edu.co. Las opiniones, informaciones, conclusiones y
cualquier otro tipo de dato contenido en este correo electrónico, no
relacionados con la actividad de la Universidad Nacional de Colombia, se
entenderá como personales y de ninguna manera son avaladas por la
Universidad.