2011-05-26 17 views
6

Mi trama de datos tiene varias columnas de la siguiente manera:obtener la media columna A basado en un rango de valores de la columna B

df1 <- data.frame(A = c(1,2,4), B=c(1,3,1), C=c(1,1,3)) 

que tienen dos condiciones para obtener valores promedio para la columna A.

  • Condición 1: Quiero obtener el promedio de la columna A cuando B es 1, es decir, solo se promediarán row1 y row2.
  • Condición 2: Quiero obtener el promedio de la columna B cuando los valores de la columna A son mayores que 1 pero menores que 3, es decir, solo se considerará la fila 2.

Sé que puedo usar el filtro para cortar el marco de datos para tener la columna B = 1 solamente. Sin embargo, no estoy seguro de cómo hacerlo cuando quiero que la columna B se considere como un rango dentro de 1 y 3.

¿Hay alguna forma más inteligente de obtener los valores promedio de la columna sin cortar el marco de datos en un tamaño más pequeño? ¿primero?

+0

En condición 1: 'B == 1' en las filas 1 y 3, no 1 y 2. ¿Es esto un error tipográfico? – Chase

+2

vea también '? Cut' y'? Tapply' o '? Aggregate' o ... –

Respuesta

2

Puede combinar dos pruebas lógicas con &. Por lo que podría combinar el análisis de B > 1 con B < 3:

# Condition A: 
mean(df1$A[df1$B==1]) 

# Condition B: 
mean(df1$B[df1$A>1 & df1$A<3]) 
7

usted puede hacer su subsetting en la misma llamada a mean así:

with(df1, mean(A[B == 1])) 

with(df1, mean(B[A > 1 & A < 3])) 
+0

+1 para el uso de" con ", que es más limpio que df1 $ A, etc. –

Cuestiones relacionadas