如何使用If表达式而不是result [result == Inf]?
我想使用If表达式更改此代码。
x=c(1:10,Inf,-Inf)
rescale01 <- function(x) {
rng <- range(x, na.rm = TRUE, finite = TRUE)
y <- (x - rng[1]) / (rng[2] - rng[1])
y[y == -Inf] <- 0
y[y == Inf] <- 1
y
}
我尝试过,但是我不知道怎么了。 请帮忙! 这是我尝试的代码。
x=c(1:10,Inf,-Inf)
rescale01=function(x){
rng=range(x, na.rm=T, finite=T)
result=(x-rng[1])/(rng[2]-rng[1])
if (result==Inf){
Inf=1
}
if (result==-Inf){
-Inf=-1
}
else {
print(result)
}
}
答案 0 :(得分:1)
if(x==Inf) {} else {}
结构不起作用,因为if
仅采用长度为1的向量用于比较。因此,如果您提供长度大于一的向量,则其他值将被忽略。
使用ifelse()
,因为它是矢量化的,这意味着它将立即评估整个矢量。
出于您的目的,由于您有两个ifelse()
语句,因此需要嵌套的if
。
编辑:感谢@linog的评论,我们使用identical(x, Inf)
而不是x==Inf
。由于没有对same进行矢量化处理,并且返回单个值TRUE
或FALSE
,因此我们使用sapply
对整个矢量执行操作。
x=c(1:10,Inf,-Inf)
rescale01=function(x){
rng=range(x, na.rm=T, finite=T)
result=(x-rng[1])/(rng[2]-rng[1])
result = ifelse(sapply(result, identical, Inf), 1, ifelse(sapply(result, identical, -Inf), -1, result))
return(result)
}
rescale01(x)
[1] 0.0000000 0.1111111 0.2222222 0.3333333 0.4444444 0.5555556 0.6666667
[8] 0.7777778 0.8888889 1.0000000 1.0000000 -1.0000000