我有一个向量v
,我想从v
中删除向量v
的最大值。我可以找到每个值重复多少次,但如何从R中的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个,我该怎么办?
答案 0 :(得分:14)
替代
v[v < max(v)]
[1] 0.25 0.25 0.30 0.30 0.30 5.00 6.00 6.50
答案 1 :(得分:8)
可能逻辑索引在这里更快:
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 machine):
## 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
编辑(arun)
就我所见,逻辑索引向量比使用“which”和直接索引元素要慢。这才是最重要的。我还创建了一个帖子here以了解原因,如果有人有一个答案,我想要一个答案...... :)
答案 2 :(得分: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
所以我们只是说删除这些位置的值。