首页 > 解决方案 > 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)
}
}

标签: r

解决方案


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

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

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

编辑:感谢@linog 的评论,我们使用identical(x, Inf)而不是x==Inf. 由于相同没有向量化并返回单个值,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

推荐阅读