1

我有一个向量,我想从中删除向量的v最大值。我可以发现每个值重复了多少次,但是如何删除R中的最大值?vvvv

v = c(0.25, 0.25, 0.3, 0.3, 0.3, 5, 6, 6.5, 8, 8, 8)
max(v)
[1] 8
j = as.numeric(unname(table(v)))
j
[1] 2 3 1 1 1 3

另外,如果我有另一个a向量

a = rep(1, length(v))

长度相同v,我想删除最后 3 个,我该怎么办?

4

3 回答 3

16

替代

v[v < max(v)]
[1] 0.25 0.25 0.30 0.30 0.30 5.00 6.00 6.50
于 2013-07-30T04:00:06.233 回答
9

可能的逻辑索引在这里更快:

v[v != max(v)]

## > v[v != max(v)]
## [1] 0.25 0.25 0.30 0.30 0.30 5.00 6.00 6.50

编辑 想要添加基准:

v <- rep(c(0.25, 0.25, 0.3, 0.3, 0.3, 5, 6, 6.5, 8, 8, 8), 10000) #repeat 10,000 x

a <-function() v[v != max(v)]
b <-function() v[-which(v == max(v))]
d <- function() v[!v== max(v)]
e <- function() v[v < max(v)]
f <- function() v[which(v != max(v))]
g <- function() v[which(v < max(v))]

使用 microbenchmark 包进行 100 次复制(win 7 机器):

## Unit: milliseconds
##  expr      min       lq   median       uq       max neval
##   a() 2.854048 2.990731 3.200889 4.734276 54.814676   100
##   b() 3.268299 3.487321 3.642666 5.241360  6.254832   100
##   d() 3.016389 3.265034 3.454200 5.027703 54.879986   100
##   e() 2.748151 2.892300 3.095694 4.475367  5.394139   100
##   f() 2.047936 2.208645 2.423001 3.967349 54.291730   100
##   g() 1.948105 2.208178 2.352093 3.860988  4.995748   100

编辑(阿伦)

据我所知,对向量进行逻辑索引比使用“which”和直接对元素进行索引要慢。这就是与众不同的地方。我还在这里创建了一个帖子了解原因,如果有人有,我想要一个答案...... :)

于 2013-07-30T03:58:45.287 回答
2
v[-which(v == max(v))]
# [1] 0.25 0.25 0.30 0.30 0.30 5.00 6.00 6.50

which(v == max(v))返回v等于最大值的位置:

which(v == max(v))
[1]  9 10 11

所以我们只是说删除这些位置的值。

于 2013-07-30T03:54:43.013 回答