2011-05-26 72 views
6

我的数据帧有几列如下:得到平均列A

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

我有两个条件得到平均值为列A

  • 条件1:当B是1时,我想得到A列的平均值,即只有row1和row2会被平均。
  • 条件2:当列A的值大于1但小于3时,我想获得列B的平均值,即只考虑第2行。

我知道我可以使用过滤器来剪切数据帧以使列B = 1。但是,我不确定如何做到这一点,当我想列B被认为是在1和3范围内。

有没有更聪明的方法来获得列的平均值而不会将数据帧切割成更小的尺寸第一?

+0

在条件1和3,而不是1和2.这是一个错字吗? – Chase 2011-05-26 12:01:48

+2

另请参阅'?cut'和'?tapply'或'?aggregate'或... – 2011-05-26 12:07:45

回答

2

您可以结合两个逻辑测试&。像这样

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

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

你可以做你的子集在同一调用mean:行1'乙== 1`:所以,你可以在B > 1测试与B < 3结合

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

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

+1用于使用“with”,它比df1 $ A等清洁。 – 2011-05-26 15:40:05