Cómo contar el número de columnas por condición en otra columna.
Tengo un dataframe que se ve así:
data <- as.data.frame(cbind('01-01-2018' = c(1.2,3.1,0.7,-0.3,2.0), '02-01-2018' = c(-0.1, 2.4, 4.9,-3.3,-2.7), '03-01-2018' = c(3.4, -2.6, -1.8, 0.1, 0.3)))
01-01-2018 02-01-2018 03-01-2018
1 1.2 -0.1 3.4
2 3.1 2.4 -2.6
3 0.7 4.9 -1.8
4 -0.3 -3.3 0.1
5 2.0 -2.7 0.3
Quiero contar cuántas veces por cada fila, un valor es mayor que el promedio de la fila correspondiente.
data$mn <- apply(data, 1, mean)
01-01-2018 02-01-2018 03-01-2018 mn
1 1.2 -0.1 3.4 1.5000000
2 3.1 2.4 -2.6 0.9666667
3 0.7 4.9 -1.8 1.2666667
4 -0.3 -3.3 0.1 -1.1666667
5 2.0 -2.7 0.3 -0.1333333
Mi último intento fue el siguiente:
df$events <- apply(data, 1, function(x) sum(x > data$mn))
uhi_events <- numeric(nrow(data))
for (i in 1:nrow(data)) {
uhi <- data[[6]][[i]][["values"]]
uhi_events[i] <- sum(uhi)
}
data$uhi_events <- uhi_events
¿Existe una opción más eficiente?
EDIT: ¿Qué pasa si la condición está en otra columna, digamos data$c1, que no se obtiene a través de una fórmula simple?
data$md <- apply(data, 1, median)
01-01-2018 02-01-2018 03-01-2018 md
1 1.2 -0.1 3.4 1.5000000
2 3.1 2.4 -2.6 0.9666667
3 0.7 4.9 -1.8 1.2666667
4 -0.3 -3.3 0.1 -1.1666667
5 2.0 -2.7 0.3 -0.1333333
davy.ai
Sí, hay una opción más eficiente usando
rowSums()
y un operador de comparación para contar el número de valores mayores que el promedio de cada fila:Esto creará una nueva columna en el dataframe
data
llamadacount
que contiene el número de valores mayores que el promedio de cada fila.Si la condición está en otra columna, aún puedes usar
rowSums()
y un operador de comparación para contar el número de filas que cumplen la condición:Esto creará una nueva columna en el dataframe
data
llamadacount
que contiene el número de filas donde el valor en la columnac1
es mayor que la mediana de cada fila.