Penso che scoprirai che "ifelse" non è un'operazione vettoriale (in realtà si comporta come un ciclo), e quindi gli ordini di grandezza sono più lenti del vettore equivalente. R favorisce le operazioni vettoriali, che è il motivo per cui applicare, mapply, sapply è un fulmine veloce per determinati calcoli.
Dataset di piccole dimensioni, non è un problema, ma se si dispone di un array di lunghezza pari o superiore a 100k, è possibile andare a cucinare una cena arrosto prima che termini con un ciclo qualsiasi.
Il seguente codice dovrebbe funzionare.
Per vettore
minvalue <- 0
X[X < minvalue] <- minvalue
Per dataframe o Matrix.
minvalue <- 0
n <- 10 #change to whatever.
columns <- c(1:n)
X[X[,columns] < minvalue,columns] <- minvalue
altro metodo veloce, con funzioni Pmax e Pmin, questa caps voci tra 0 e 1 e si può mettere una matrice o dataframe come primo argomento senza problemi.
ulbound <- function(v,MAX=1,MIN=0) pmin(MAX,pmax(MIN,v))
La domanda su cosa sostituire con valori negativi o zero è interessante. Poiché così tanti modelli sono costruiti su una base di log (y), spesso li sostituisco con il punto medio tra il limite inferiore del normale e lo zero. (Probabilmente una domanda secondaria posta al meglio su stats.exchange.) –
@Dwin, +1 a quel commento. Mi piacerebbe vedere questa seconda domanda, e le sue risposte su crossvalidated.com –
è un commento interessante- Vedo quello che stai dicendo ... Per il contesto, sto usando questi valori in una regressione con i dati del dipartimento di emergenza (studio epidemiologico della popolazione). La spiegazione che mi è stata data per spiegare perché sostituire <0,1 con 0 era che non vogliamo sovrastimare l'effetto ... qualcosa con "zero inflazionato"? – mEvans