Ho un vettore nella gamma [1,10]
Come mappare un vettore in un intervallo diverso in R?
c(1,2,9,10)
e voglio farlo corrispondere ad una serie diversa, ad esempio [12,102]
c(12,22,92,102)
C'è una funzione che già fa questo in R?
Ho un vettore nella gamma [1,10]
Come mappare un vettore in un intervallo diverso in R?
c(1,2,9,10)
e voglio farlo corrispondere ad una serie diversa, ad esempio [12,102]
c(12,22,92,102)
C'è una funzione che già fa questo in R?
linMap <- function(x, from, to)
(x - min(x))/max(x - min(x)) * (to - from) + from
linMap(vec, 12, 102)
# [1] 12 22 92 102
O più esplicitamente:
linMap <- function(x, from, to) {
# Shifting the vector so that min(x) == 0
x <- x - min(x)
# Scaling to the range of [0, 1]
x <- x/max(x)
# Scaling to the needed amplitude
x <- x * (to - from)
# Shifting to the needed level
x + from
}
rescale(vec, c(12, 102))
opere usando il pacchetto scales
. Inoltre si potrebbe sfruttare approxfun
in modo intelligente come suggerito da @flodel:
linMap <- function(x, a, b) approxfun(range(x), c(a, b))(x)
Ho un comportamento temporale nel tuo 'linMap' e' rescale' dove alcune colonne vanno a zero in R 3.3.2. Valori di esempio 'all.dat <- c (2274959, 1531001)'. Sai perché? –
@Masi, cosa intendi per comportamento temporale? Suppongo che 'all.dat' sia' x' nella notazione della mia risposta. Allora cos'è 'from',' to', il tuo output atteso e cosa stai ottenendo, invece? – Julius
Ricevo invece zero colonne. –
Puoi spiegare la tua mappatura? Non capisco perché 2 sia mappato a 62 o perché 270 sia lì dentro poiché non rientra nell'intervallo. – David
Mi dispiace @David, ho mescolato due esempi che stavo usando per capire il problema. È fondamentalmente una mappatura lineare. – nachocab
Questo dovrebbe essere ovvio, ma questa non è una domanda 'R'. È una domanda riguardante l'algebra lineare di base. –