【发布时间】:2013-12-21 12:31:06
【问题描述】:
我有一个向量
x <- c(-1, 0, 1, 2, 3)
我希望所有小于 1 的值都被 1 替换。
怎么做?
有没有无循环的解决方案?
【问题讨论】:
标签: r
我有一个向量
x <- c(-1, 0, 1, 2, 3)
我希望所有小于 1 的值都被 1 替换。
怎么做?
有没有无循环的解决方案?
【问题讨论】:
标签: r
使用带替换的逻辑索引:
x[ x<1 ] <- 1
【讨论】:
pmax 或pmin,但我想我会切换。这同样具有可读性,并且具有我不会错误地使用 pmin 来设置最小值的优点。
pmax 是一个很好的候选人
> pmax(x, 1)
[1] 1 1 1 2 3
【讨论】:
其他解决方案更合适。这只是为了好玩:
(x > 1) * (x - 1) + 1
#[1] 1 1 1 2 3
简单替换 (@Matthew Lundberg) 是最有效的解决方案:
library(microbenchmark)
microbenchmark(pmax(1, x),
"[<-"(x, x < 1, 1),
(x > 1) * (x - 1) + 1)
# Unit: microseconds
# expr min lq median uq max neval
# pmax(1, x) 15.494 16.2545 16.5165 16.9365 52.165 100
# `[<-`(x, x < 1, 1) 1.466 1.6920 2.3325 2.7485 23.683 100
# (x > 1) * (x - 1) + 1 2.084 2.2870 2.7880 3.2080 8.958 100
【讨论】:
(foo <- x <1)*1 + (!foo)*x
*1。
(function(C) C + (!C) * x)(x<1)
x 的表达之间的差异要小得多,但替换的最大值较低。但是,如果您使用更长的向量,那么我们的两种方法的结果就是洗牌,pmax 显然是赢家。 (x <- sample(c(-1,0,1,2,3), 1e7, replace=TRUE))
另一个选项是replace:
x <- c(-1, 0, 1, 2, 3)
replace(x, x < 1,1)
# [1] 1 1 1 2 3
【讨论】: