Я думаю, вы обнаружите, что ifelse не является векторной операцией (она фактически выполняется в виде цикла), и поэтому она на несколько порядков медленнее, чем векторный эквивалент.R предпочитает векторные операции, поэтому применять, mapply, sapply молниеносно для некоторых вычислений.
Небольшие наборы данных, не проблема, но если у вас есть массив длиной 100 КБ или более, вы можете пойти и приготовитьжареный ужин до его завершения любым методом, включающим цикл.
Код ниже должен работать.
Для вектора
minvalue <- 0
X[X < minvalue] <- minvalue
Для Dataframe или Matrix.
minvalue <- 0
n <- 10 #change to whatever.
columns <- c(1:n)
X[X[,columns] < minvalue,columns] <- minvalue
Другой быстрый метод, с помощью функций pmax и pmin, ограничивает записи от 0 до 1, и вы можете поместить матрицу или фрейм данных в качестве первого аргумента без проблем.
ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))