R选择重复行

62o28rlo  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(125)

好吧,我对R还是个新手,我试着搜索文档来寻找我需要做的事情,但是这里有个问题。
我有一个名为www.example.com的数据框架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(列的连续部分)等于最佳.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

数据实际上并没有排序,而且还有很多列,但这就是概念
谢谢!

wydwbb8l

wydwbb8l1#

你的问题本质上 * 只是 * 一个复杂的索引问题。我这里有一个解决方案,虽然可能有更简单的。我加载了您的示例数据到DF
首先,这会得到最佳的行索引(使用which.min()很容易):

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

接下来,我们执行一个逐行比较(在我们所关心的列的子集上,这里只按位置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)来表示所需的列。

mspsb9vt

mspsb9vt2#

这是一个展示merge是一个强大R函数的机会。
使用这些数据:

dat <- read.csv(textConnection('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'))

我们计算如下:

imin <- which.min(dat$fitness)                     ## identify min row
  dupcols <- c('green.h.0', 'green.v.0', 'offset.0') ## dup cols for checking
  merge(dat, dat[imin, dupcols], by=dupcols, all=F)

给予

>   merge(dat, dat[imin, dupcols], by=dupcols, all=F)
  green.h.0 green.v.0 offset.0 eval.num eval.count fitness fitness.mean
1       120        40       NA        1       1500  1500.0          100
2       120        40       NA        2       1000  1250.0          100
3       120        40       NA        3       1250  1250.0          100
4       120        40       NA        4       1000  1187.5          100

相关问题