es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

🙂

Tags:  , , ,

Answer

  1. Avatar for 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.

Comments are closed.