Home Forum Statistica con R Funzione per il calcolo dell'età

This topic contains 2 replies and has 1 voice.

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #4156
    Alfonso
    Alfonso
    Participant

    sto provando a realizzare una funzione che, partendo dalla variabile $AnnoNascita, contenente l’anno di nascita dell’utente, mi calcola l’età attuale dell’utente e salva il tutto in una nuova variabile del data frame $eta.. Ho fatto questo:

    > etas <- function(x){
    +     date <- Sys.Date()
    +     year <- as.numeric(format(date, format="%Y"))
    +     x$eta <- year - x[[1]]
    + }

    quando però vado a visualizzare il dataframe mi risulta tutto invariato, ovvero non mi viene inserita la nuova variabile…

    > head(ut)
      AnnoNascita RegioneResidenza ProvResidenza ComuneResidenza AddReg AddComSaldo
    1        1926               16            SR            B603 207.96       67.38
    2        1971               16            SR            I754 222.39       72.03
    3        1930               16            SR            I754 218.80       70.86
    4        1947               21            VR            B107 252.95      115.53
    5        1950               15            CI            F841 360.15      129.83
    6        1939                3            BZ            A952   0.00       12.81

    ho provato anche ad inserire una return(x) a chiusura della funzione e in effetti mi stampa l’intero dataframe aggiungendo la nuova variabile, ma una volta conclusasi l’esecuzione della funzione etas() se visualizzo il dataframe questo è ancora senza variabile delle eta.. come mai?

    • This topic was modified 1 year, 5 months ago by Alfonso Alfonso.
    #4158
    Alfonso
    Alfonso
    Participant

    ecco la prova col return:

    > etas <- function(x){
    +     date <- Sys.Date()
    +     year <- as.numeric(format(date, format="%Y"))
    +     x$eta <- year - x[[1]]
    +     return(x)
    + }
    > etas(us)
       AnnoNascita RegioneResidenza ProvResidenza ComuneResidenza AddReg AddComSaldo eta
    1         1926               16            SR            B603 207.96       67.38  90
    2         1971               16            SR            I754 222.39       72.03  45
    3         1930               16            SR            I754 218.80       70.86  86
    4         1947               21            VR            B107 252.95      115.53  69
    5         1950               15            CI            F841 360.15      129.83  66
    6         1939                3            BZ            A952   0.00       12.81  77
    7         1964               21            PD            L805  45.84        0.00  52
    8         1957               21            VR            E358 212.21       84.58  59
    9         1944               10            PV            L872 135.48       61.72  72
    10        1951               21            VR            C498 189.09       86.08  65
    > us
       AnnoNascita RegioneResidenza ProvResidenza ComuneResidenza AddReg AddComSaldo
    1         1926               16            SR            B603 207.96       67.38
    2         1971               16            SR            I754 222.39       72.03
    3         1930               16            SR            I754 218.80       70.86
    4         1947               21            VR            B107 252.95      115.53
    5         1950               15            CI            F841 360.15      129.83
    6         1939                3            BZ            A952   0.00       12.81
    7         1964               21            PD            L805  45.84        0.00
    8         1957               21            VR            E358 212.21       84.58
    9         1944               10            PV            L872 135.48       61.72
    10        1951               21            VR            C498 189.09       86.08
    #4165
    Alfonso
    Alfonso
    Participant

    da come ho potuto capire questo è un problema legato a come R gestisce la memoria, perchè quando passo il data frame alla funzione, R non passa un riferimento alla locazione di memoria in cui è salvata la struttura dati, ma un’intera copia della struttura, quindi le modifiche vengono apportate alla copia interna alla funzione mentre la struttura dati originaria non subisce alcuna modifica. Pertanto per ovviare a questo problema ho fatto in modo tale che la funzione mi restituisse un vettore contenente tutte le età calcolate e quindi ho fatto l’assegnazione in questo modo:
    us$eta <- etas(us)
    così facendo il vettore fornito in uscita dalla funzione etas() viene poi direttamente salvato nella nuova variabile us$eta

Viewing 3 posts - 1 through 3 (of 3 total)

You must be logged in to reply to this topic.