2011-08-30 32 views
1

我在R(1.2M記錄)中有一個大的數據集。這些是針對不同協議的一些讀數。現在,我想分類這些數據(我可以使用rpart/RWeka進行分類)。但是,我首先需要處理這些數據,而這個問題恰恰與此有關。如何處理與大數據集中的特定條件匹配的數據R

數據集由4組不同協議的每對控制參數組成的輸出(吞吐量,響應時間)組成。現在,我想「裝箱」這些值,並且對於每組控制參數,只選擇那些處於最大吞吐量(對於那組輸入參數)的10%中的協議,以及最小響應時間的10%中的那些協議。

我知道我可以使用聚合來查找另一個data.frame中的最大吞吐量,最小響應時間,然後將其與原始data.frame結合起來。然後,我可以使用ifelse來查找符合標準的協議名稱。然而,在我看來,這樣做效率低下,我不知道如何在一列中編碼多個匹配(每組輸入值)。

有什麼建議嗎?

例(REQS與代表輸入參數):

PROTO REQS REPS THR RT 
A  8  8  10 1 
B  8  8  9.5 2 
C  8  8  7 1.1 
A  16 8  10 4 
B  16 8  5 1 
C  16 8  1 0.5 
A  8  16 8 1 
B  8  16 10 1.09 
C  8  16 9.5 1 

應該產生這樣的:從plyr

REQS REPS THRGOOD RTGOOD BOTHGOOD 
8 8 A,B  A,C A 
16 8 A  C  empty 
8 16 B,C  A,B,C B,C 

回答

2

ddply這裏應該是你的朋友。

首先,編寫一個函數,會給你想要的結果,如果你要得到一個data.frame只行1組輸入參數:

forOneSet<-function(dfr) 
{ 
    THRlim<-0.9*max(dfr$THR) #is this what you want - adapt if needed? 
    RTlim<-0.1*min(dfr$RT) #is this what you want - rather unlikely - adapt if needed? 
    thrgood<-dfr$PROTO[dfr$THR > THRlim] 
    rtgood<-dfr$PROTO[dfr$RT < RTlim] 
    bothgood<-union(thrgood, rtgood) 
    #return a data.frame with the wanted results for this 'partial' data.frame 
    data.frame(REQS=dfr$REQS[1], REPS=dfr$REPS[1], THRGOOD=paste(thrgood, collapse=","), RTGOOD=paste(rtgood, collapse=","), BOTHGOOD=paste(bothgood, collapse=",")) 
} 

現在,您可以立即使用ddply(我假設你原來data.frame被稱爲orgdfr):

result<-ddply(orgdfr, .(REQS, REPS), forOneSet) 
+0

我不知道ddply,整潔的事情,謝謝......不過,這件事運行這臺機器上會很慢,它仍在運行(到目前爲止3小時)。 –

+0

這很慢,因爲我試圖變得聰明,用'.parallel = TRUE'運行它,使用'doSMP'和4個工作線程。由於這些工作人員使用額外的記憶,因爲沒有明天,系統會發生顛簸...... –

+0

(關於您的第一條評論)我很擔心。如果你確實知道行的順序是正確的,那麼你可能會更好一些,在數據框中添加一個新的列是一個因子,並將行結合起來(即值1,1,1,2, 2,2,3,3,3,4,4,4,...)。我不知道ddply的內部結構,但這似乎是合理的。 –