Cómo estimar las medias de una misma columna en un gran número de dataframes, basándose en una variable de agrupación en R.
Tengo una gran cantidad de DFs en R (>50), que corresponden a diferentes filtraciones que he realizado, aquí hay un ejemplo de 7 de ellos:
Steps_Day1 <- filter(PD2, Gait_Day == 1)
Steps_Day2 <- filter(PD2, Gait_Day == 2)
Steps_Day3 <- filter(PD2, Gait_Day == 3)
Steps_Day4 <- filter(PD2, Gait_Day == 4)
Steps_Day5 <- filter(PD2, Gait_Day == 5)
Steps_Day6 <- filter(PD2, Gait_Day == 6)
Steps_Day7 <- filter(PD2, Gait_Day == 7)
Cada uno de los dataframes contiene 19 variables, sin embargo, solo me interesa su velocidad (para calcular la media) y su subjectID, ya que cada sujeto tiene múltiples observaciones de velocidad en el mismo DF.
Un ejemplo de los datos en los que estamos interesados, en el dataframe – Steps_Day1:
Speed SubjectID
0.6 1
0.7 1
0.7 2
0.8 2
0.1 2
1.1 3
1.2 3
1.5 4
1.7 4
0.8 4
Los datos llegan hasta 61 puntos y el número de observaciones de cada participante es mucho mayor que esto.
Ahora lo que quiero hacer es crear un código que recorra automáticamente cada uno de los 50 dataframes (tomando los 7 anteriores como ejemplo) y calcule la velocidad media para cada participante y lo guarde en un nuevo dataframe, junto con las variables que contienen las medias para cada participante en los otros DFs.
Un ejemplo de Steps day 1 (Valores no precisos)
Speed SubjectID
0.6 1
0.7 2
1.2 3
1.7 4
y así sucesivamente… Antes de obtener un DF final que contenga en columnas las medias para cada participante de cada uno de los otros dataframes, que puede verse así:
Steps_Day1 StepsDay2 StepsDay3 StepsDay4 SubjectID
0.6 0.8 0.5 0.4 1
0.7 0.9 0.6 0.6 2
1.2 1.1 0.4 0.7 3
1.7 1.3 0.3 0.8 4
Podría hacer esto a través de un código horrible, desordenado y largo, pero busco si alguien tiene ideas más intuitivas, ¡por favor!
🙂
davy.ai
Una forma de lograr esto es utilizando un bucle for. Aquí tienes un ejemplo de código que debería funcionar para tu caso:
“`{r}
Crear un data frame vacío para almacenar las velocidades medias
mean_speeds <- data.frame(SubjectID = unique(PD2$SubjectID))
Recorrer cada uno de los data frames
for (i in 1:50) {
# Crear un data frame temporal para el data frame actual
current_df <- get(paste0(“Steps_Day”, i))
# Calcular la velocidad media para cada sujeto
current_means <- aggregate(current_df$Speed,
by = list(current_df$SubjectID),
FUN = mean)
# Renombrar la columna de media para que coincida con el día actual
colnames(current_means) <- c(“SubjectID”, paste0(“Steps_Day”, i))
# Fusionarlo con el data frame mean_speeds
mean_speeds <- merge(mean_speeds, current_means, by = “SubjectID”, all = TRUE)
}
Imprimir el data frame final
mean_speeds
“`
Este código primero crea un data frame vacío para almacenar las velocidades medias de cada sujeto. Luego recorre cada uno de los 50 data frames, calcula la velocidad media para cada sujeto y lo fusiona con el data frame mean_speeds. Finalmente, imprime el data frame resultante con las velocidades medias para cada sujeto de cada uno de los otros data frames.
Nota: Esto asume que los data frames están nombrados de manera consistente como Steps_Day1, Steps_Day2, … Steps_Day50. Si la convención de nombres es diferente, es posible que debas modificar el código en consecuencia.