Ecco un approccio diverso utilizzando @ suggerimento di Juba. Per ottenere da una risposta arrotondato al floor
o ceil
abbiamo semplicemente bisogno di correggere un po ':
floorR = function(x) {
rounded = signif(x, 1);
rounded - (rounded > x) * 10^trunc(log10(x))
}
ceilR = function(x) {
rounded = signif(x, 1);
rounded + (rounded < x) * 10^trunc(log10(x))
}
EDIT2: dopo vettorializzazione, le funzioni sono un po' più lento (vedere la storia di modifica per non vettorizzati le versioni). Sono ancora veloce per i piccoli vettori, ma non scala nonché di @ sgibb soluzione (in parte perché signif
non scala molto bene):
x = 156; microbenchmark(floorEx(x), flr(x), floor2(x), signif(x), floorR(x), times = 10000)
#Unit: nanoseconds
# expr min lq median uq max neval
# floorEx(x) 4008 8348 10018 12021 158934 10000
# flr(x) 84810 121204 135896 141571 6708248 10000
# floor2(x) 32055 46078 51086 54091 360606 10000
# signif(x) 0 1002 1336 1671 86813 10000
# floorR(x) 3006 6679 8348 10017 207683 10000
x = c(1:1000); microbenchmark(floorEx(x), signif(x), floorR(x), times = 100)
#Unit: microseconds
# expr min lq median uq max neval
# floorEx(x) 125.879 157.4315 158.934 161.4385 243.742 100
# signif(x) 147.581 216.6975 217.365 220.5375 395.998 100
# floorR(x) 252.758 360.6055 362.275 366.4485 619.373 100
sono i numeri che vanno a essere singolare? O c'è un vettore di numeri su cui pensi di farlo? –
Che ne dici di questo? 'floor (x/10^(nchar (x) -1)) * 10^(nchar (x) -1)' – Arun
cosa fai con i numeri negativi? o inferiore a 1, ad es. 1.2e-3? – baptiste