R для вопросов программирования данных науки - PullRequest
0 голосов
/ 18 апреля 2020

Как я могу использовать выражения 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 Ответ

1 голос
/ 18 апреля 2020

Структура if(x==Inf) {} else {} не работает, потому что if принимает только вектор длиной один, который будет использоваться для сравнения. Поэтому, если вы предоставляете вектор длиной больше единицы, другие значения игнорируются.

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...