2013-06-12 72 views
4

我有一個行數非常大且只有兩個配對列的矩陣。我想計算第1列中每行之間的差異,並且如果差異小於預定義值(.001),則計算兩列中這些行的平均值。比如我有一個叫權重矩陣,大量行之間的差異

A  B 
185.0765 10 
185.3171 20 
186.0777 30 
186.0780 40 
188.0078 50 

weights<-as.data.table(weights) 
bins<-weights[A %between% c(A[3],(A[3]+.001))] 
meanA<-mean(bins$A) 
meanB<-mean(bins$B) 

和結果矩陣是

A  B 
185.0765 10 
185.3171 20 
186.0779 35 
188.0078 50 

我會感激,如果有人能請諮詢我如何爲大量的行做到這一點。我認爲使用for循環不會很有效。

+0

+1用於輸入數據和期望的輸出以及有趣的問題。 –

回答

6

這應該做到你想做的事,使用data.table

DT <- data.table(weights) 
DT[ , Group :=(cumsum(c(1 , ifelse(diff(weights$A) < 0.001 , 0 , 1)))) ] 
DT[ , lapply(.SD, mean) , by=Group , .SDcols = c("A","B") ] 
# Group  A B 
#1:  1 185.0765 10 
#2:  2 185.3171 20 
#3:  3 186.0779 35 
#4:  4 188.0078 50 

的想法是,我們使用的累加值發現有< 0.001的差異A組。如果差異低於此閾值,我們會在我們的Group列中放入0,因此在累計總和中它將成爲同一組的一部分。

至於建議的@eddi這樣做是做分組和計算都在同一時間,在一個呼叫的更簡潔和有效的方式:

DT <- data.table(weights) 
DT[ , lapply(.SD, mean) , by = list(Group = cumsum(c(1,diff(A)) >= 0.001)) , .SDcols = c("A","B") ]  

順便說一句,擁有絕對數量的行總是有幫助的。 A 非常大的數字對不同的人和用例而言意味着不同的東西。我們正在說萬元嗎?億萬?

+2

+1這是'.SD'的理想用法,因爲它使用'.SD'中的所有信息。使用'.SD'的主要低效率是如果從中取得一部分行;例如,頭(.SD,2)浪費地創建了所有的「.SD」,即使只需要前兩行。但是通過'.SD'的'lapply'使用了所有的數據,而'.SD'就是這樣,尤其是'.SDcols'。 –

+0

@MatthewDowle啊好吧,我想我正在慢慢開始理解'.SD'和美妙的'data.table'軟件包! (感謝和一個帽子!) –

+0

@ SimonO101這樣做的技巧。感謝您的幫助。:) – jsin