2016-03-12 246 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]])})