2010-04-03 116 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)用于我们想要的列。