我有丝束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
任何想法?
我有丝束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
任何想法?
tapply函数是你需要的。 tapply(df$B, df$A, mean)
应该做的伎俩。有更有效的方法可以为更大的数据做到这一点。也看看group_by并在dplyr中进行总结。
这取决于您的间隔是否包含或不包括(第二行包含在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]])})
你可以用'cut'创建分组变量,然后得到“B”的'mean' – akrun
能告诉你如何请,我也想用类绘制什么意思呢? – temor
在示例中显示,A的值不在4-6之间。对于这些情况,你想填写'B'的'mean'? – akrun