我有一个向量,我想从中删除向量的v
最大值。我可以发现每个值重复了多少次,但是如何删除R中的最大值?v
v
v
v
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 个,我该怎么办?
我有一个向量,我想从中删除向量的v
最大值。我可以发现每个值重复了多少次,但是如何删除R中的最大值?v
v
v
v
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 个,我该怎么办?
替代
v[v < max(v)]
[1] 0.25 0.25 0.30 0.30 0.30 5.00 6.00 6.50
可能的逻辑索引在这里更快:
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”和直接对元素进行索引要慢。这就是与众不同的地方。我还在这里创建了一个帖子来了解原因,如果有人有,我想要一个答案...... :)
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
所以我们只是说删除这些位置的值。