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.

¿Buscando optimizar la agrupación de observaciones en un dataframe con pruebas lógicas en otro dataframe?

Soy un traductor de español que traduce documentos de TI. Traduce lo siguiente al español. No traduzcas el código y la salida en markdown.

Soy un programador autodidacta en busca de algunos comentarios sobre el algoritmo que tengo para clasificar observaciones. Tengo 2 marcos de datos, df1 y df2, con un conjunto de observaciones. Quiero asociar los eventos de una serie temporal a otra serie temporal en función de cuándo ocurrieron. He probado diferentes enfoques y he terminado con la siguiente función.

bin_observations <- function(df1, df2) {
  df1$beat.bin <- "NA"
  df1$beat.bin <- as.integer(df1$beat.bin)
  for (h in 1:nrow(df1)) {
    for(g in 1:nrow(df2)) {
      if (is.na(df1$beat.bin[h] == TRUE) & df1$SECONDS[h] <= df2$SECONDS[g]) {
          df1$beat.bin[h] <- df2$beat[g-1]
      }
    }
  }
  return(df1)
}

La clave para que la función funcione según lo escrito fue introducir una prueba lógica para ver si el campo en el que estaba escribiendo ya había sido escrito. Antes de esto, estaba haciendo una serie de comprobaciones en los valores de cada marco de datos entre sí para encontrar el bin de tiempo. Aquello fue un desorden de lógica condicional.

Mi pregunta es: ¿cuál sería un enfoque mejor para hacer algo así? Además, si alguien pudiera señalarme algunos recursos buenos que pueda utilizar para mejorar mi código, lo agradecería mucho.

Aquí están los datos del ejemplo y un ejemplo de la salida.

df.1 <- data.frame(SECONDS = c(0.043, 0.169, 0.260, 0.384, 0.448, 0.869, 1.038, 1.560, 1.584, 1.644, 1.780, 2.772, 2.839, 3.080, 3.616))

df.2 <- data.frame(SECONDS = c(0.000, 0.510, 1.018, 1.518, 2.023, 2.531, 3.038, 3.546, 4.051, 4.569, 5.080, 5.595),
                   beat = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))

df.1 <- bin_observations(df1 = df.1, df2 = df.2 )

Aquí tienes la salida:

> df.1
   SECONDS beat.bin
1    0.043        1
2    0.169        1
3    0.260        1
4    0.384        1
5    0.448        1
6    0.869        2
7    1.038        3
8    1.560        4
9    1.584        4
10   1.644        4
11   1.780        4
12   2.772        6
13   2.839        6
14   3.080        7
15   3.616        8

Gracias por cualquier consejo o idea.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en R y optimización, sugeriría las siguientes mejoras para la función bin_observations:

    1. Evite el uso de bucles anidados, ya que hacen que la función sea lenta e ineficiente, especialmente cuando se trabaja con conjuntos de datos grandes. En su lugar, utilice funciones vectorizadas como apply, lapply o sapply para iterar sobre las filas de los data frames.
    2. Utilice las funciones merge o join de los paquetes dplyr o data.table para unir los dos data frames basándose en la columna SECONDS en lugar de utilizar bucles anidados.

    3. Utilice la función ifelse para evitar las pruebas lógicas dentro del bucle que comprueba si el campo ha sido escrito o no. Esta función es una versión vectorizada de la instrucción if y puede aplicar la condición a todo el vector en una sola operación.

    4. Evite el uso de enteros para la columna beat.bin y utilice factores en su lugar. Los factores son eficientes cuando se trabaja con variables categóricas y pueden ayudar a ahorrar memoria y tiempo de cálculo.

    5. Agregue el manejo de errores y la validación de entrada al comienzo de la función para asegurarse de que los data frames de entrada tengan el formato correcto y las columnas requeridas.

    Recursos para mejorar el código en R:

    1. Libro de Hadley Wickham sobre paquetes y funciones en R: https://r-pkgs.org/

    2. Libro “Advanced R” de Hadley Wickham: https://adv-r.hadley.nz/

    3. Cursos en línea de RStudio sobre programación en R: https://education.rstudio.com/courses/

    4. Sitio web de R-bloggers para consejos, trucos y tutoriales sobre programación en R: https://www.r-bloggers.com/

    5. CRAN Task Views para encontrar paquetes relacionados con temas específicos en R: https://cran.r-project.org/web/views/

Comments are closed.