Myślę, że przekonasz się, że "ifelse" nie jest operacją wektorową (faktycznie działa jako pętla), a więc jest to kolejność wielkości wolniejsza niż odpowiednik wektorowy. R faworyzuje operacje wektorowe, dlatego zastosowanie, mapply, sapply są błyskawiczne dla pewnych obliczeń.
Małe zbiory danych, nie jest problem, ale jeśli masz tablicę o długości 100k lub więcej, możesz iść i ugotować pieczoną kolację, zanim skończy się na jakiejkolwiek metodzie z udziałem pętli.
Poniższy kod powinien zadziałać.
Dla wektora
minvalue <- 0
X[X < minvalue] <- minvalue
Dla Dataframe lub Matrix.
minvalue <- 0
n <- 10 #change to whatever.
columns <- c(1:n)
X[X[,columns] < minvalue,columns] <- minvalue
Kolejny szybki sposób, za pośrednictwem funkcji pmax i Pmin, to czapki wpisów pomiędzy 0 a 1 i można umieścić matrycę lub dataframe jako pierwszy argument żadnych problemów.
ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))
Pytanie o to, co zastąpić wartości ujemne lub zerowe, jest interesujące. Ponieważ wiele modeli jest zbudowanych na zasadzie log (y), często zastępuję je punktem środkowym między dolnym limitem normalnym i zerem. (Prawdopodobnie wtórne pytanie najlepiej postawione na stats.exchange.) –
@Dwin, +1 do tego komentarza. Chciałbym zobaczyć to drugie pytanie, a jego odpowiedzi na crossvalidate.com –
to ciekawy komentarz - widzę to, co mówisz ... W kontekście używam tych wartości w regresji z danymi z oddziału ratunkowego (badanie epidemiologiczne populacji). Wyjaśnienie, które mi podano, dlaczego zastąpić <0,1 0, było takie, że nie chcemy przeceniać efektu ... czegoś związanego z "zero zawyżone"? – mEvans