2010-04-03 119 views
3

好吧,我對R相當陌生,我試圖搜索我需要做的文檔,但這裏是問題所在。R選擇重複的行

我有一個名爲heeds.data的數據框,格式如下(爲簡單起見省略了一些列) eval.num,eval.count,... fitness,fitness.mean,green.h.0,green .v.0,offset.0,green.h.1,green.v.1,... green.h.7,green.v.7,offset.7 ...

而且我選擇了一行符合以下條件:

best.fitness <- min(heeds.data$fitness.mean[heeds.data$eval.count >= 10]) 
best.row <- heeds.data[heeds.data$fitness.mean == best.fitness] 

現在,我想都等於最好有列green.h.0到offset.7(列的連續段)其他行的。行

我想這可能工作

heeds.best <- heeds.data$fitness[ 
    heeds.data$green.h.0 == best.row$green.h.0 & ... 
] 

但隨着24列這似乎是一個愚蠢的方法。用較少的手動輸入尋找更簡單的東西。

下面是一個簡短的數據樣本,以顯示我想

eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0 
1   1   1500  1500   100  120  40 
2   2   1000  1250   100  120  40 
3   3   1250  1250   100  120  40 
4   4   1000  1187.5  100  120  40 
5   1   2000  2000   200  100  40 
6   1   3000  3000   150  90   10 
7   1   2000  2000   90   90   100 
8   2   1800  1900   90   90   100 

應該選擇「最佳」作爲行4 後來我想抓住的結果如下

eval.num, eval.count, fitness, fitness.mean, green.h.0, green.v.0, offset.0 
1   1   1500  1500   100  120  40 
2   2   1000  1250   100  120  40 
3   3   1250  1250   100  120  40 
4   4   1000  1187.5  100  120  40 

數據ISN什麼實際上排序和有更多列但這是概念

謝謝!

+1

你能編輯你的文章來真正顯示數據和代碼嗎? – 2010-04-03 17:26:26

+0

好的,那是怎麼回事?我希望這更清楚。至於代碼,我知道如何選擇我想要的最低值,並且我需要代碼來獲取與某個列匹配的行。 – Matt 2010-04-03 17:47:16

回答

4

你的問題本質上是只是一個複雜的索引問題。我有一個解決方案,雖然可能會更簡單。我裝你的例子數據到DF

首先,這會讓我們(易於使用which.min())最佳行指數:

R> bind <- which.min(DF[,"fitness.mean"]) # index of best row 

接下來,我們apply()逐行對比(在列的子集,我們關心,這裏索引只是由位置5到7)。

我們使用比較函數cmpfun來比較當前行r與最佳行(索引bind),並使用all()獲取所有元素對應的行。 [我們在這裏需要drop=FALSE才能使它在兩側相當,否則as.numeric()有幫助。 ]

R> cmpfun <- function(r) all(r == DF[bind,5:7,drop=FALSE]) # compare to row bind 

此我們簡單apply此行方式:

R> brows <- apply(DF[,5:7], 1, cmpfun) 

而這些都是我們所需要的行:

R> DF[brows, ] 
    eval.num eval.count fitness fitness.mean green.h.0 green.v.0 offset.0 
1  1   1 1500   1500  100  120  40 
2  2   2 1000   1250  100  120  40 
3  3   3 1250   1250  100  120  40 
4  4   4 1000   1188  100  120  40 
R> 

它沒有問題,我們使用三列作比較 - 重要的是我們有一個索引表達式(這裏是5:7)用於我們想要的列。