r - 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)
}
}
解决方案
该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
推荐阅读
- perl - 寻求避免“远距离行动”的模式
- java - 使用 gson 解析大型 json 文件
- javascript - 单击时,重定向到新页面并滚动到该新页面上的特定 div
- r - 列中的折叠功能
- excel - 将单元格转换为变体数组
- android - 即使在android studio中匹配父级,表格也太宽了
- c - 如何有选择地将二维数组的列或行传递给函数?
- networking - 403 Forbidden on a specific page,但仍能正确加载?
- xslt - XSLT - 将更新“应用”到另一个文件
- javascript - Mozilla Rhino JavaScript 引擎编译失败(无法在不同目录中找到文件)