【问题标题】:R selecting duplicate rowsR选择重复的行
【发布时间】:2011-02-04 01:06:53
【问题描述】:

好的,我对 R 还很陌生,我已经尝试在文档中搜索我需要做的事情,但这就是问题所在。

我有一个名为 heeds.data 的 data.frame,格式如下(为简单起见,省略了一些列) eval.num,eval.count,...适应度,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

数据实际上并没有排序,还有更多列,但这就是概念

谢谢!

【问题讨论】:

  • 您可以编辑您的帖子以实际显示数据和代码吗?
  • 好的,怎么样?我希望这会让事情变得更清楚。至于代码,我知道如何选择我想要的最低值,并且我需要代码来获取某些列与该列匹配的行。

标签: r select statistics duplicates dataframe


【解决方案1】:

您的问题本质上只是一个复杂的索引问题。我在这里有一个解决方案,尽管可能有更简单的解决方案。我将您的示例数据加载到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)用于我们想要的列。

【讨论】:

    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多