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.

¿Cuál es la manera rápida de determinar qué puntos de datos se encuentran por encima de una línea multifragmentada predefinida?

Necesito escanear casi un millón de puntos de datos y determinar si están por encima o por debajo de un umbral. Tengo el umbral definido globalmente y tengo una función predefinida simple que llamo con mapply, que escribirá una columna de bandera 0/1 en mi dataframe. Esto es bastante sencillo, puedo marcar docenas de señales con sus respectivos umbrales de esta manera en un segundo dataframe grande. Ahora me pidieron que hiciera un umbral más complejo que tenga la forma de una línea multifragmentada. ¿Cuál es la forma más rápida de marcar los puntos de datos dados que solo tienen visibles los puntos de esquina de la línea multifragmentada? Hasta ahora tenía un umbral predefinido (gris 0.2) y usé mapply para escanear la señal dibujada en el eje x. Simplemente usé una función para devolver 0 o 1 si el punto de datos era más pequeño o más grande que el umbral. Ahora necesito una línea multifragmentada como la dibujada en rojo para hacer el mismo trabajo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para marcar puntos de datos basados en una línea segmentada múltiple, se puede utilizar la función segments para dibujar los segmentos de línea y luego la función point.in.polygon del paquete sp para determinar si un punto de datos se encuentra dentro del polígono definido por los segmentos de línea. Aquí está un código de ejemplo:

    library(sp)
    
    # definir los puntos de esquina de la línea segmentada múltiple
    x <- c(0, 20, 40, 60, 80, 100)
    y <- c(0.2, 0.3, 0.4, 0.6, 0.8, 1)
    
    # dibujar los segmentos de línea
    plot(x, y, type="l", lwd=2, xlab="señal", ylab="umbral")
    segments(x[-length(x)], y[-length(y)], x[-1], y[-1], col="red", lwd=2)
    
    # crear una matriz de los vértices del polígono
    poly <- cbind(x, y)
    
    # definir una función para comprobar si un punto de datos se encuentra dentro del polígono
    is.point.in.poly <- function(point, poly) {
      point <- as.matrix(point)
      poly <- as.matrix(poly)
      pnpoly <- function(x,y,poly) {
        n <- dim(poly)[1]
        inside <- FALSE
        for (i in 1:n) {
          if (((poly[i,2] < y) & (poly[j,2] >= y) | (poly[j,2] < y) & (poly[i,2] >= y))) {
            if (poly[i,1] + (y - poly[i,2]) / (poly[j,2] - poly[i,2]) * (poly[j,1] - poly[i,1]) < x) {
              inside <- !inside
            }
          }
        }
        inside
      }
      pnpoly(point[,1], point[,2], poly)
    }
    
    # generar algunos puntos de datos de ejemplo
    df <- data.frame(x = runif(100000, 0, 100), y = runif(100000, 0, 1))
    
    # marcar los puntos de datos basados en si se encuentran dentro del polígono o no
    df$flag <- ifelse(point.in.polygon(df[,c("x","y")], poly), 1, 0)
    

    La función is.point.in.poly comprueba si un punto de datos dado se encuentra dentro del polígono definido por poly. La función point.in.polygon aplica esta función a cada punto de datos en el marco de datos usando mapply, devolviendo un vector de banderas que indican si cada punto de datos se encuentra dentro del polígono o no.

Comments are closed.