2016-03-12 252 views
-1

我有丝束colomns的数据帧:如何计算值的平均间隔?

A  B 
    1  5 
    2  4 
    1  3 
    2  2 
    3  5 

我需要的是计算从A 意味着对某些类B中的所有值: 例如计算意味着对于所有B值(即仅对应从0到2从A)和相同的2-4 所以我的班级从A 0-2 2-4 4-6

任何想法?

+0

你可以用'cut'创建分组变量,然后得到“B”的'mean' – akrun

+0

能告诉你如何请,我也想用类绘制什么意思呢? – temor

+0

在示例中显示,A的值不在4-6之间。对于这些情况,你想填写'B'的'mean'? – akrun

回答

-1

tapply函数是你需要的。 tapply(df$B, df$A, mean) 应该做的伎俩。有更有效的方法可以为更大的数据做到这一点。也看看group_by并在dplyr中进行总结。

1

这取决于您的间隔是否包含或不包括(第二行包含在0-2间隔和2-4间隔中,或只是其中之一)。

如果间隔没有关闭(间隔至少半开)和相邻@akrun给了一个评论,最好的方法使用cut函数来创建一个新的分组因子cut(df$A, breaks=2*(0:3)),然后使用tapply申请基于此的均值使用tapply(df$B,cut(df$A, breaks=2*0:3,FUN=mean)。这种方法不会处理需要闭合间隔的情况,或者可能会出现多个间隔的情况。它也不会给你一个没有积分下降的时间间隔的值(可能或不需要)。间隔也必须相邻。


以下方法允许任意间隔,默认情况下,标识没有点落下的间隔。点数可以在多个区间内下降。

df<-data.frame(A=c(1,2,1,2,3),B=c(5,4,3,2,5)) 
cuts<-matrix(c(0,2,2,4,4,6),ncol=2,byrow=TRUE) 

这里,削减矩阵将包含实际的间隔边界:

 [,1] [,2] 
[1,] 0 2 
[2,] 2 4 
[3,] 4 6 

现在我们写函数,在区间

cls<-function(vals,cat) {(vals>=cat[1]&vals<=cat[2])} 

选择元素这里cls预计会收到一个向量值和一个向量,给出一个区间的上限和下限。它返回一个布尔向量,指示该值是否在间隔中。例如,cls(df$A,c(0,2))产生

[1] TRUE TRUE TRUE TRUE FALSE 

告诉我们,但所有A的最后一个值是在区间0〜2。

最后,我们可以找到B值的平均值为像这样的每个间隔,

apply(cuts,1,function(x){mean(df$B[cls(df$A,x)])}) 

这矩阵(1处理所述切口每一行作为第二选项按行单元),并计算对应于由该行指定的间隔A值B值的平均值(df$B[cls(df$A,x)]使用我们CLS函数来找到在由x指定的间隔将A的值,然后选择B值s对应于此 - 返回值为TRUE)。

结果是

[1] 3.500000 3.666667  NaN 

这告诉我们的对应A值从0到2为3.5,对应A值从2至4是B值的平均值的B值的平均值3和2/3,并且没有B值对应于从4到6的A值(因为不存在这样的A值)。


如果一个半开放的需要,很容易修改CLS这样。如果我们希望排除右边界,我们可以使用

cls<-function(vals,cat) {(vals>=cat[1]&vals<cat[2])} 

,如果我们希望排除的下边界,我们可以使用

cls<-function(vals,cat) {(vals>cat[1]&vals<=cat[2])} 

或使用严格开区间,我们可以做

cls<-function(vals,cat) {(vals>cat[1]&vals<cat[2])} 

然而,在这些情况下,使用内置的cut功能可能是最好的。


如果你不想创建函数CLS,整个选择可以是直列状

apply(cuts,1,function(x){mean(df$B[df$A>=x[1]&df$A<=x[2]])}) 

或者,省去了需要削减变量以及,

apply(matrix(c(0,2,2,4,4,6),ncol=2,byrow=TRUE),1,function(x){mean(df$B[df$A>=x[1]&df$A<=x[2]])})