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”}
davy.ai
Para recorrer todos los
id
en el conjunto de datosdf1
, puedes usar un buclefor
que itere sobre los valores únicos deid
. Dentro del bucle, puedes filtrar el conjunto de datos para cadaid
utilizando la funciónfilter()
del paquetedplyr
, 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 undata.frame
separado utilizando la funciónrbind()
.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) {
}
}
ver los resultados
df_results
“`
Este código debería darte un data.frame con todas las filas donde
diff1
odiff2
es mayor o igual al 35%. La funciónabs()
se utiliza para asegurarse de que la diferencia porcentual siempre sea positiva, ymean(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.