回答
x <- seq(0.1,10,0.1)
> x
[1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5
[16] 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0
[31] 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5
[46] 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0
[61] 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.2 7.3 7.4 7.5
[76] 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9.0
[91] 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10.0
> ifelse(x < 5, 1, 2)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[38] 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
这对于仅替换一些值也是非常有用的:例如'x = ...; x [x <5] = 1'是'ifelse(x <5,1,x)' – 2015-02-21 17:23:33
如果我想返回另一个向量的元素,该怎么办? – skan 2017-03-08 13:38:53
@skan尝试'y [x <5]'。假设'x'和'y'的长度相同 – 2017-03-08 15:12:52
y <- if (x < 5) 1 else 2
不会对整个向量(您收到警告告诉你只有条件的第一个元素将被使用)操作。你想ifelse
:
y <- ifelse(x < 5, 1, 2)
ifelse
运行在整个逻辑向量,元素的元素。 if
只接受一个逻辑值。请参阅?"if"
和?ifelse
为了完整:在大向量中,可以使用索引来加快速度(我们通常在模拟中执行此操作,其中函数通常运行1000到10000次)。但只要没有必要,只需使用ifelse
即可。这读起来更容易。
> set.seed(100)
> x <- runif(1000,1,10)
> system.time(replicate(10000,{
+ y <- ifelse(x < 5,1,2)
+ }))
user system elapsed
2.56 0.08 2.64
> system.time(replicate(10000,{
+ y <- rep(2,length(x))
+ y[x < 5]<- 1
+ }))
user system elapsed
0.48 0.00 0.48
您可以进一步缩短这个时间。我的机器在0.436中执行了第二种方法(尽管它在第一种方法中速度较慢),但是这又使其再提高了200%:system.time(replicate(10000,{
@Dwin:非常好的解决方案!谢谢。但是在我的机器上,它的运行速度只有微小的提高(0.47比0.48) – 2010-10-31 19:59:35
小心 - 如果'x'包含'NA'元素(在第一个元素中保留“NA”,但将被赋值为1 '第二个)。 – jbaums 2014-07-13 09:31:59
继上述文章之后,您甚至可以使用和修改满足标准的矢量元素。在我看来,如果计算速度更快并不昂贵,那么应该始终这样做。
x = seq(0.1,10,0.1)
y <- rep(2,length(x))
y[x<5] <- x[x<5]*2
上一篇文章的代码最好回答这个问题。但是,如果我不得不使用上面的代码,我会做:
x = seq(0.1,10,0.1)
y <- rep(2,length(x))
y[x<5] <- x[x<5]*0 +1
答案可能会根据投票向上或向下移动,因此与“上述帖子”相关可能会很麻烦。 – 2016-08-31 17:40:39
你也可以只创建逻辑向量和1把它
x <- seq(0.1, 10, 0.1) # Your data set
(x >= 5) + 1
# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# [92] 2 2 2 2 2 2 2 2 2
如果想比较性能,将是最快的解决方案
set.seed(100)
x <- runif(1e6, 1, 10)
RL <- function(x) y <- ifelse(x < 5,1,2)
JM <- function(x) {y <- rep(2, length(x)); y[x < 5] <- 1}
DA <- function(x) y <- (x >= 5) + 1
library(microbenchmark)
microbenchmark(RL(x),
JM(x),
DA(x))
# Unit: milliseconds
# expr min lq mean median uq max neval
# RL(x) 331.83448 366.52940 378.89182 374.99741 381.08659 609.21218 100
# JM(x) 38.72894 42.18745 44.36493 43.25086 44.09626 82.76168 100
# DA(x) 10.01644 11.96482 14.21593 13.17825 14.12930 53.76923 100
对于更有效率的方法,您可以将代码修改为'function(x)y <- (x > = 5L)+ 1L',但通常是一个很好的答案,并且有趣的是看看'ifelse'的速度有多慢。 – 2014-12-30 14:21:09
nzMean <- function(x) { mean(x[x!=-1],na.rm=TRUE)}
nzMin <- function(x) {min(x[x!=-1],na.rm=TRUE)}
nzMax <- function(x) { max(x[x!=-1],na.rm=TRUE)}
nzRange<-function(x) {nzMax(x)-nzMin(x)}
nzSD <- function(x) { SD(x[x!=-1],na.rm=TRUE)}
#following function works
nzN1<- function(x) {ifelse(x!=-1,(x-nzMin(x))/nzRange(x) ,x) }
#following is bad as it returns only 4 not 5 elements of vector
nzN2<- function(x) {ifelse(x!=-1,(x[x!=-1]-nzMin(x))/nzRange(x) ,x) }
#following is bad as it returns 5 elements of vector but not correct answer
nzN3<- function(x) {ifelse(x!=-1,(x[x!=-1]-nzMin(x))/nzRange(x) ,-1) }
y<-c(1,-1,-20,2,4)
a<-nzMean(y)
b<-nzMin(y)
c<-nzMax(y)
d<-nzRange(y)
# test the working function
z<-nzN1(y)
print(z)
- 1. 向量化语句中的R求和
- 2. 内部if语句杀死向量化
- 3. 替代R语句中的if语句
- 4. 使用if ... else if ... else语句创建一个向量R
- 5. ASH if if语句中的if语句
- 6. PHP IF语句中的IF IF语句
- 7. 优化大量的IF语句
- 8. if语句中的变量
- 9. 变量中的if语句
- 10. if语句中的变量
- 11. 反向if语句
- 12. 简化if语句?
- 13. 简化if语句
- 14. 向变量添加if语句
- 15. R中的If语句的说明
- 16. JavaScript if if语句变量
- 17. 如何使用if语句向多个语句进行矢量化?
- 18. “else if”语句在R
- 19. Java变量初始化和if语句
- 20. R中的If-then-else语句
- 21. R中的线性回归if语句
- 22. 使用“if”语句中的R
- 23. 在IF语句中意外的'<='R
- 24. r中的if语句错误
- 25. 批量--IF语句
- 26. if语句中if语句的条件
- 27. if语句中的if语句
- 28. If语句中的If语句
- 29. 删除IF-ELSE条件语句和向量化
- 30. if语句中的语句
这也可能与'如果(条件){ } else(condition){}构造?如果没有参数变得有点棘手,有时很难阅读。我遇到了像基督教一样的问题,如果其他问题仍然存在,就像这里提到的那样,这很好,但看起来很丑。到目前为止,我正在使用表达式({是}),这是一个很好的解决方法,但我仍然想知道是否有一个用if和else来做。 – 2010-12-06 09:17:36