我有絲束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