好的,我是R的新手,我试图在文档中搜索我需要做的事情,但问题就在这里。
我有一个名为heeds.data的data.frame,格式如下(为简单起见省略了一些列) 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(列的连续部分)等于best.row
我以为这可能有效
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
数据实际上没有排序,还有更多列,但这是概念
谢谢!
答案 0 :(得分: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
)。