Variabili: trasformazioni (1)

Nota

Per le espressioni vedi anche Espressioni

Argomenti comuni previsti dalle seguenti funzioni:

  • varlist: la lista delle variabili su cui applicare la funzione
  • valuelist: la lista dei valori necessari per applicare la funzione
  • :[in]to => varlist: se specificato, le trasformazioni vengono applicate alle variabili specificate e non a quelle originarie
  • :if => expression: la condizione per selezionare i casi a cui applicare la funzione
  • :else => value|:copy: quando specificato :if il valore da attribuire per gli altri casi; :copy copia i valori esistenti
  • :seed => number: permette alle funzioni aleatorie di riprodurre, a parità di condizioni, gli stessi risultati
  • :size => #: la dimensione della variabile finale
  • :ndec => #: il numero di decimali della variabile finale
  • :type => #: il tipo della variabile finale

Le funzioni restituiscono l’elenco delle variabili trasformate, quindi è possibile concatenare le funzioni tra loro:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
p strip(:str1, :into => :str2)         # => [:str2]

upcase strip :str1                     # 2 funzioni
upcase(strip(:str1))                   # 2 funzioni con tutte le parentesi anche se non sono necessarie
upcase strip(:str1)                    # 2 funzioni con le parentesi solo per la funzione interna

resize upcase(strip(:str1)), 10        # 3 funzioni; le parentesi permettono di attribuire correttamente il parametro 10 a resize

upcase strip(:str1, :into => :str2)    # :str1 non viene modificata
upcase strip(:str1), :into => :str2    # :str2 risulta come nell'esempio precedente, ma snche :str1 viene modificata

Suggerimento

Per realizzare espressioni di trasformazione più complesse, vedere le istruzioni compute, recode, ecc..

Funzioni generiche

val

Assegna alle variabili un valore. Accetta un solo valore per tutte le variabili. Se le variabili non esistono, verranno create.

1
2
3
4
val :v1, 1
val :v1, :v2, :v3, 99

val :v2, 1, :if => :mcr => 4

first

Restituisce il primo valore valido.

1
first :v1, :v2, :v3, :into => :x1

last

Restituisce l’ultimo valore valido.

1
2
last :v1, :v2, :v3, :into => :x1
last :d5, 0, :to => :x5

Funzioni di conversione

to_i

Converte la variabile e il suo contenuto in variabile integer.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale (non applicata ai dati)
1
to_i :s1, :into => :v1

to_flt

Converte la variabile e il suo contenuto in variabile float.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale (non applicata ai dati)
  • ndec: (opzionale) il numero di decimali della variabile finale (non applicato ai dati)
  • size.ndec: (opzionale) la dimensione e il numero di decimali della variabile finale (non applicati ai dati)
1
2
3
to_flt :price, 4.2
to_flt :peso, 4, 2
to_flt :s1, :into => :v1

to_str

Converte la variabile e il suo contenuto in variabile string.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale
1
to_str :d1, :into => :s1

to_lev

Converte la variabile e il suo contenuto in una variabile string sostituendo ai dati l’etichetta del livello.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale
1
to_lev :d1, :into => :s1

to_codelev

Converte la variabile e il suo contenuto in una variabile string sostituendo ai dati il codice e l’etichetta del livello.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale
  • sep: (default -) il carattere per separare il codice dall’etichetta
1
to_codelev :d1, 25, '/', :into => :s1

to_d

Converte la variabile string o integer e il suo contenuto in variabile date.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale (default 10)
1
2
to_d :strday, :into => :date1
to_d :ymd, :into => :date2

to_dt

Converte la variabile string o integer e il suo contenuto in variabile datetime.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale (default 25)
1
2
to_dt :strdaytime, :into => :datetime1
to_dt :ymdhms, :into => :datetime2

Valori mancanti

fillval

Sostituisce i valori mancanti con il valore specificato.

1
2
fillval :v1, 1.0              # sostituisce i valori mancanti di :v1 con 1.0
fillval :v1, :v2, 9           # sostituisce i valori mancanti di :v1 e di :v2 con 9

fillna

Sostituisce i valori validi con valore mancate (blank).

1
fillna :v1

fillavg

Sostituisce i valori mancanti con la media dei valori validi.

1
fillavg :v1, :ndec => 2

fillmin

Sostituisce i valori mancanti con il valore minimo.

1
fillmin :v1

fillmax

Sostituisce i valori mancanti con il valore massimo.

1
fillmax :v1

filldown

Sostituisce i valori mancanti con il valore del record precedente.

1
2
3
filldown :v1        # [1, nil, nil, 2, 1, 2, 2, nil, 1] => [1, 1, 1, 2, 1, 2, 2, 2, 1]

filldown :v1, :v1_2, :v1_2b, :into => s(:x1_,3)

fillup

Sostituisce i valori mancanti con il valore del record seguente.

1
2
3
fillup :v1          # [1, nil, nil, 2, 1, 2, 2, nil, 1] => [1, 2, 2, 2, 1, 2, 2, 1, 1]

fillup s(:v7_,10), :into => s(:v77_,10)

fillrnd

Sostituisce i valori mancanti con dei valori casuali.

Argomenti aggiuntivi:

  • I valori da generare:
    • valuelist: un elenco di valori
    • num1..num2: un range di valori
    • se non indicato, utilizza i codici dei livelli della variabile oppure, in mancanza di livelli definiti, i valori presenti nei dati
  • :ndec => n: il numero di decimali
1
2
3
4
5
6
7
fillrnd :v1, 2, 5, 9

fillrnd :v2, 3..7

fillrnd :v3, -1.0..1.0, :ndec => 2

fillrnd :v1

fillprop

Sostituisce i valori mancanti con dei valori secondo le proporzioni indicate. Se l’argomento :prop non è indicato, vengono utilizzate le distribuzioni di frequenze della variabile. Se è attivo un peso, vengono utilizzate le distribuzioni pesate.

Argomenti aggiuntivi:

  • I valori da generare:
    • :prop => {val1=>prop1, val2=>prop2, ...}: un hash con le coppie valore-proporzione. I valori vengono comunque riproporzionati sulla loro somma
    • se non indicato, utilizza le distribuzioni di frequenze pesate della variabile
1
2
3
4
5
fillprop :v1, :prop => {1=>0.05, 2=>0.25, 3=>0.30, 4=>0.40} # \
fillprop :v1, :prop => {1=>5, 2=>25, 3=>30, 4=>40}          #  > sono equivalenti
fillprop :v1, :prop => {1=>15, 2=>75, 3=>90, 4=>120}        # /

fillprop :v2

randna

Inserisce dei valori mancanti nella variabile.

Argomenti aggiuntivi:

  • n|n1..n2: il numero di valori mancanti da inserire. Se indicato un range, verrà estratto casualmente un numero del range.
1
2
3
randna :v1, 10

randna :v2, :v3, 10..15

Funzioni numeriche

round

Arrotonda il valore della variabile.

1
2
3
round :peso, 3
round :peso, 2, :into => :peso2, :if => {:sesso => 1}, :else => :copy
round :ipf1, :ipf2, 5, :into => [:newpeso1, :newpeso2], :else => 0

trunc

Tronca la variabile al valore intero senza arrotondamento.

1
2
trunc :peso, :into => :p1
trunc mult(:peso, 100), :into => :p2

sum

Somma variabili e costanti nella variabile specificata nel parametro :into. I casi con valore mancante su tutte le variabili producono valore mancante, mentre per quelli con almeno un valore valido su una delle variabili, i valori mancanti sono considerati uguali a zero.

1
2
3
4
5
sum :peso, :peso2, :peso3, :into => :sommapesi  # somma :peso+:peso1+:peso2 in :sommapesi

sum :v1, :v2, 100, :into => :x1                 # somma :v1+:v2+100 in :x1

sum :peso :peso2, :peso3, :into => :peso        # :peso conterrà la somma :peso+:peso1+:peso2

mean

Calcola la madia dei valori nella variabile specificata nel parametro :into. I casi con valore mancante su tutte le variabili producono valore mancante, mentre per quelli con almeno un valore valido su una delle variabili, i valori mancanti sono esclusi dal calcolo.

1
mean :peso, :peso2, :peso3, :into => :meanpesi

subt

Esegue la sottrazione tra la prima variabile elencata e altre variabili o costanti. I casi con valore mancante sulla prima variabile producono valore mancante, mentre eventuali altri valori mancanti sono considerati uguali a zero.

1
2
subt :tot, :p1, :p2, :into => :diff1
subt :tot, 100, :into => :diff1

mult

Moltiplica variabili e costanti. I casi con valore mancante sulla prima variabile producono valore mancante, mentre eventuali altri valori mancanti vengono ignorati.

1
2
mult :peso1, :peso2, :peso3, :into => :peso
mult :prop, 100, :into => :perc

div

Divide due variabili o una variabile e una costante tra loro.

1
2
div :price, 10, :into => :p1
div :v1, :tot, :into => :p2

divi

Esegue una divisione intera tra due variabili o tra una variabile e una costante.

1
divi :price, 2, :into => :p2

mod

Calcola il resto della divisione intera tra due variabili o tra una variabile e una costante.

1
mod :price, 2, :into => :p2

min

Restituisce il valore più basso.

1
min :p1, :p2, :p3, :into => :pmin

max

Restituisce il valore più alto.

1
max :p1, :p2, :p3, :into => :pmax

obsnum

Numera progressivamente le osservazioni.

1
2
3
obsnum :nrow

obsnum :n_male, :if => "sex=1"

obscount

Conta il numero di osservazioni.

1
2
3
obscount :totcases

obscount :tot_male, :if => "sex=1"

countval

Conta il numero di occorrenze di uno o più valori.

1
2
3
countval s(:d7_,10), 1, :into => :count7a
countval s(:d7_,10), nil, :into => :count7b
countval s(:d7_,10), [nil,0], :into => :count7c

Funzioni stringa

upcase

Converte in maiuscolo la stringa.

1
upcase :str1    # "dante aligHIERI" => "DANTE ALIGHIERI"

downcase

Converte in minuscolo la stringa.

1
downcase :str2    # "dante aligHIERI" => "dante alighieri"

capitalize

Converte la stringa in minuscolo con la prima lettera in maiuscolo.

1
capitalize :str2, :into => :str12    # "dante aligHIERI" => "Dante alighieri"

cap

Converte la prima lettera in maiuscolo lasciando invariato il resto della stringa.

1
capitalize :str2, :into => :str12    # "dante aligHIERI" => "Dante aligHIERI"

titleize

Converte la stringa in minuscolo con la prima lettera di ciascuna parola in maiuscolo.

1
titleize :str1, :into => :str11    # "dante aligHIERI" => "Dante AligHIERI"

titl

Converte la prima lettera di ciascuna parola in maiuscolo lasciando invariato il resto della stringa.

1
titleize :str1, :into => :str11    # "dante aligHIERI" => "Dante AligHIERI"

resize

Ridimensiona il contenuto della variabile stringa. Non modifica la dimensione della variabile.

1
resize :str2, 6    # "Dante Alighieri" => "Dante "

strip

Elimina gli spazi iniziali e finali e gli spazi doppi dalla stringa.

1
strip :str1    # "  Dante  Alighieri " => "Dante Alighieri"

strfill

Sostituisce tutti i caratteri della stringa.

Argomenti aggiuntivi:

  • char: il carattere di riempimento: default asterisco (*)
  • size: la lunghezza della stringa di riempimento: default la lunghezza della stringa esistente
1
2
strfill :str1            # "Dante Alighieri" => "***************"
strfill :str1, 'X', 5    # "Dante Alighieri" => "XXXXX"

lpad

Aggiunge caratteri all’inizio della stringa.

Argomenti aggiuntivi:

  • char: il carattere di riempimento: default zero (0)
  • size: la lunghezza complessiva della stringa finale: default la dimensione definita (size) della variabile
1
2
lpad :id            # "123" => "000123"
lpad :id, '0', 8    # "123" => "00000123"

rpad

Aggiunge caratteri alla fine della stringa.

Argomenti aggiuntivi:

  • char: il carattere di riempimento: default zero (0)
  • size: la lunghezza complessiva della stringa finale: default la dimensione definita (size) della variabile
1
2
rpad :id            # "123" => "123000"
rpad :id, '0', 8    # "123" => "12300000"

substr

Sostituisce le occorrenze di un testo con un altro testo. E’ possibile usare espressioni regolari.

1
2
3
4
substr :str1, "Mese", "Month"                      # "Mese 12, 2019" => "Month 12, 2019"

substr :str1, /^.*(\d{2}).*(\d{4}).*$/, '\2-\1'    # "Mese 12, 2019" => "2019-12"
substr :str1, /^.*(\d{2}).*(\d{4}).*$/, "\\2-\\1"  # se si usano gli apici doppi bisogna fare l'escaping del backslash

Nota

Un espressione regolare è racchiusa tra due caratteri /.

Il carattere i dopo il secondo / indica che il confronto è case-insensitive.

Nella stringa di sostituzione è possibile utilizzare \1, \2, ecc. per identificare i gruppi catturati dalle parentesi tonde () nell’espressione di ricerca. E’ necessario però racchiudere la stringa tra apici singoli ' o raddoppiare i backslash \\.

concat

Concatena due o più variabili e costanti in una variabile stringa.

1
concat :d1, '-', :d5, '_', :str1, :into => :s1

strjoin

Unisce più variabili separandole con la stringa indicata.

1
strjoin :d1, :d5, :str1, '.', :into => :s2

separate

Suddivide una variabile stringa in più parti e le inserisce in nuove variabili.

Argomenti aggiuntivi:

  • char: il carattere di separazione: default caratteri diversi da numeri e lettere
  • :conv: il simbolo di un metodo per per convertire il risultato: :to_i, :to_f, :to_s, ...
1
2
separate :str1, '/', :into => [:day, :month, :year]     # :str1="03/11/2019" => :day="03", :month="11", :year="2019"
separate :str1, :to_i, :into => [:day, :month, :year]   # :str1="04-12-2019" => :day=4, :month=12, :year=2019

Funzioni data e tempo

year

Estrae l’anno da una data.

1
year :date1, :into => y1

month

Estrae il mese da una data.

1
month :date1, :into => m1

day

Estrae il giorno da una data.

1
day :date1, :into => d1

wday

Estrae il giorno della settimana da una data (1..7; 1=Lunedì, 7=Domenica).

1
wday :date1, :into => wd1

yday

Estrae il numero di giorno dell’anno da una data (1..366).

1
yday :date1, :into => yd1

hours

Estrae le ore da una variabile datetime.

1
hours :datetime1, :into => h1

minutes

Estrae i minuti da una variabile datetime.

1
minutes :datetime1, :into => mi1

seconds

Estrae i secondi da una variabile datetime.

1
seconds :datetime1, :into => s1