R用于数据科学编程问题

时间:2020-04-18 13:03:54

标签: r

如何使用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)
}
}

1 个答案:

答案 0 :(得分:1)

if(x==Inf) {} else {}结构不起作用,因为if仅采用长度为1的向量用于比较。因此,如果您提供长度大于一的向量,则其他值将被忽略。

使用ifelse(),因为它是矢量化的,这意味着它将立即评估整个矢量。

出于您的目的,由于您有两个ifelse()语句,因此需要嵌套的if

编辑:感谢@linog的评论,我们使用identical(x, Inf)而不是x==Inf。由于没有对same进行矢量化处理,并且返回单个值TRUEFALSE,因此我们使用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