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.

Función con bucle para crear una nueva tabla de datos

Tengo un conjunto de datos sobre el cual deseo iterar con una función de condición:

id <- c(1,2,3,4,5)
value1 <- c(25, 100, 15, 20, 30)
value2 <- c(130, 25, 10, 30, 20)
value3 <- c(50, 60, 20, 120, 10)
month <- c(2, 3, 4, 2, 3)
df1 <- dataframe(id,value1, value2, value3, month)

Necesito una función de condición que calcule la diferencia entre el valor 1 y 2 y entre el 1 y 3, y verifique si uno O el otro es superior al 35%. Esto no debería ser el cambio (aumento o disminución), sino simplemente la diferencia en porcentajes. Y cuando la diferencia sea igual o superior al 35%, debería agregar todas las variables para ese id específico a otro dataframe/tabla.

Sin embargo, necesito que la función itere sobre todos los ids en lugar de solo el primero.

Esto es lo que tengo hasta ahora:
“`
library(threadr)
if (percentagedifference(value1, value2) >= 35 | percentagedifference(value1, value3) >= 35) {print “malo”}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para recorrer todos los id en el conjunto de datos df1, puedes usar un bucle for que itere sobre los valores únicos de id. Dentro del bucle, puedes filtrar el conjunto de datos para cada id utilizando la función filter() del paquete dplyr, y luego calcular las diferencias porcentuales utilizando una función que reste los valores y los divida por la media. Finalmente, puedes verificar la condición y agregar la fila a un data.frame separado utilizando la función rbind().

    Aquí está el código para el bucle:

    “`{r}
    library(dplyr)

    crear un data.frame vacío para almacenar los resultados

    df_results <- data.frame()

    recorrer los valores únicos de id

    for (i in unique(df1$id)) {

    # filtrar el data.frame para el id actual
    df_current <- filter(df1, id == i)

    # calcular las diferencias porcentuales
    diff1 <- abs(df_current$value1 – df_current$value2) / mean(c(df_current$value1, df_current$value2))
    diff2 <- abs(df_current$value1 – df_current$value3) / mean(c(df_current$value1, df_current$value3))

    # verificar la condición
    if (diff1 >= 0.35 | diff2 >= 0.35) {

    # agregar la fila al data.frame de resultados
    df_results <- rbind(df_results, df_current)
    

    }
    }

    ver los resultados

    df_results
    “`

    Este código debería darte un data.frame con todas las filas donde diff1 o diff2 es mayor o igual al 35%. La función abs() se utiliza para asegurarse de que la diferencia porcentual siempre sea positiva, y mean(c()) se utiliza para calcular el promedio de dos valores.

    Ten en cuenta que es posible que necesites ajustar el código según el formato de tus datos reales.

Comments are closed.