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
- :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
- :[in]to => varlist: se specificato, le trasformazioni vengono applicate alle variabili specificate e non a quelle originarie
- :size => #: la dimensione della variabile specificata in :into
- :ndec => #: il numero di decimali della variabile specificata in :into
- :type => #: il tipo della variabile specificata in :into
- :label => "": l’etichetta della variabile specificata in :into
- :levels => {}: i livelli della variabile specificata in :into
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 di conversione¶
Se non viene specificato il parametro :into, cioè la conversione avviene sulla variabile originaria, la conversione riguarda solo il contenuto delle variabili e non i formati.
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_sng¶
Converte la variabile e il suo contenuto in variabile single convertendo anche i codici dei livelli in numeri. Utile nel caso di una varaibile numerica etichettata memorizzata come stringa.
Argomenti aggiuntivi:
- size: (opzionale) la dimensione della variabile finale
1 | to_sng :txt10, :into => :v10
|
to_val¶
Converte la variabile e il suo contenuto in variabile single sostituendo ai valori le etichette dei livelli trasformati in numero.
1 2 | to_val :d1, :into => :v1
to_val :s2
|
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
|
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
|
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_, 1..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_, 1..10), :into => s(:v77_, 1..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 quindi è possibile anche indicare valori assoluti o percentuali.- 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
|
fillupto¶
Inserisce il valore fino a raggiungere la numerosità o la percentuale indicata.
Un eventuale peso attivo, verrà ignorato.
Argomenti aggiuntivi:
- :fill => {code => n|pct, ...}: i valori o codici della variabile e le rispetive numerosità o percentuali da raggiungere.
Un valore intero viene interpretato come numerosità, un valore decimale come percentuale.
Se si utilizza un solo codice è possibile omettere :fill e scrivere direttamente code => n|pct- :replace => value|[varlist]: i valori che possono essere sostituiti.
Se non specificato verranno sostituiti solo i valori mancanti. Il valore mancante può essere indicato con nil
Quando i valori sono espressi come percentuali, queste sono calcolate sui valori iniziali. Nel caso :replace includa nil, la base considererà il totale casi, altrimenti soltanto i valori validi.
1 2 3 4 5 6 7 8 | fillupto :v10, :fill => {1=>245}
fillupto :v12, 1=>45.7, :replace => [nil,9]
fillupto :area, :fill => {2=>65, 3=>75}, :replace => 4, :if => "sesso=1"
fillupto :d7_2, 1=>155, :replace => 0
fillupto :d7_4, 1=>50.3, :replace => 0
|
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
|
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_, 1..10), 1, :into => :count7a
countval s(:d7_, 1..10), nil, :into => :count7b
countval s(:d7_, 1..10), [nil, 0], :into => :count7c
|
Funzioni stringa¶
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 "
|
ltrim¶
Elimina gli spazi iniziali dalla stringa.
1 | ltrim :str1 # " Dante Alighieri " => "Dante Alighieri "
|
rtrim¶
Elimina gli spazi finali dalla stringa.
1 | ltrim :str1 # " Dante Alighieri " => " Dante Alighieri"
|
trim¶
Elimina gli spazi iniziali e finali dalla stringa.
1 | trim :str1 # " Dante Alighieri " => "Dante Alighieri"
|
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.
Argomenti aggiuntivi:
- old: la stringa o l’espressione regolare da sostituire
- new: la nuova stringa o l’espressione regolare
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 \\.
mid¶
Estrae una porzione di una stringa per posizione.
Argomenti aggiuntivi:
- start: la posizione di inizio
- len: la lunghezza della stringa da estrarre (se non indicata estrae fino alla fine della stringa)
- :int: converte il dato in intero
- :flt: converte il dato in float
1 2 3 4 | mid :date, 1, 4, :into => :x1
mid :date, 6, 2, :int, :into => :x2, :type => :int
mid :date, 9, 2, :into => :x3
mid :date, 9, :into => :x4
|
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
|
rsplit¶
Suddivide una variabile stringa in due parti secondo la prima occorrenza a partire da destra del separatore e le inserisce in due 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 | rsplit :str1, '_', :into => [:name, :code] # :str1="d14_5_7" => :name="d14_5", :code="7"
|
lsplit¶
Suddivide una variabile stringa in due parti secondo la prima occorrenza a partire da sinistra del separatore e le inserisce in due 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 | lsplit :str1, '_', :into => [:name, :code] # :str1="d14_5_7" => :name="d14", :code="5_7"
|
num_extract¶
Estrae numeri da una stringa.
Argomenti aggiuntivi:
- :to_f: converte il numero in float
1 2 | num_extract :str1, :into => [:x1, :x2]
num_extract :str1, :to_f, :into => :x1
|
Funzioni data e tempo¶
ymd¶
Genera una variabile date a partire da tre variabili/costanti anno, mese e giorno o da una variabile/costante stringa.
1 2 3 4 5 6 7 | ymd :anno, :mese, :giorno, :into => :date1
ymd :anno, :mese, 1, :into => :date2
ymd :sdate, :into => :date3
ymd "2024-11-22", :into => :date4
ymd "22-11-2024", :into => :date5
ymd "22/11/2024", :into => :date6
ymd "20241122", :into => :date7
|
hms¶
Genera una variabile time a partire da tre variabili/costanti ore, minuti e secondi o da una variabile/costante stringa.
1 2 3 4 | hms :ore, :minuti, :secondi, :into => :time1
hms :ore, :minuti, 0, :into => :time2
hms :stime, :into => :time3
hms "15:04:59", :into => :time4
|
Suggerimento
Una variabile di formato time contiene il numero di secondi memorizzati come numeri interi.
Per trasformare una variabile integer in variabile time impostare semplicemente il type.
ymdhms¶
Genera una variabile datetime a partire da sei variabili/costanti anno, mese, giorno, ore, minuti e secondi o da una variabile/costante stringa.
1 2 3 4 5 | ymdhms :anno, :mese, :giorno, :ore, :minuti, :secondi, :into => :datetime1
ymdhms :anno, :mese, :giorno, :ore, :minuti, 0, :into => :datetime2
ymdhms :sdatetime, :into => :datetime3
ymdhms "2024-11-12 15:03:57", :into => :datetime4
ymdhms "12-11-2024 15:03:57", :into => :datetime5
|
join_dt¶
Unisce una variabile date con una variabile time generando una variabile datetime.
1 2 3 4 | join_dt :v1_data, :v1_ora, :into => :v1_data_e_ora
join_dt :v1_data, 12560, :into => :v2
join_dt :v1_data, "03:29:20", :into => :v3
join_dt "2024-06-17", "03:29:20", :into => :v4
|
wday¶
Estrae il giorno della settimana da una data (1..7; 1=Lunedì, 7=Domenica).
1 | wday :date1, :into => wd1
|
Funzioni di posizione, gruppi, rango¶
Tutte le funzioni di questa sezione prevedono obbligatoriamente i seguenti argomenti:
- varname|varlist: la variabile o le variabili che definiscono l’ordinamento/raggruppamento
- :into => varname: la variabile che deve essere creata
rank¶
Genera una variabile con il rango.
Argomenti aggiuntivi:
- :equal: il modo in cui vengono assegnati gli indici di posizione in caso di parimerito (default :mean)
- :mean: media delle posizioni
- :min: la posizione più bassa
- :max: la posizione più alta
- :seq: numera sequenzialmente
- desc => true|false: ordinamento in senso discendente (default false)
1 2 | rank :key1, :into => :rank1
rank :key1, :key2, :equal => :max, :into => :rank2
|
count_groups¶
Genera una variabile con il numero totale di gruppi definiti da una o più variabili.
1 | count_groups :key1, :key2, :into => :groups_count1
|
count_in_group¶
Genera una variabile con il numero totale di record in ciascun gruppo definito da una o più variabili.
1 | count_in_group :key1, :key2, :into => :group_count1
|
first_of_group¶
Genera un flag che identifica il primo record di ciascun gruppo definito da una o più variabili.
I dati devono essere ordinati sulle variabili che definiscono i gruppi.
1 | first_of_group :key1, :key2, :into => :flag1
|
number_in_group¶
Genera una variabile con la numerazione progressiva dei record all’interno di un gruppo definito da una o più variabili.
I dati devono essere ordinati sulle variabili che definiscono i gruppi.
Argomenti aggiuntivi:
- desc => true|false: ordinamento in senso discendente (default false)
1 | number_in_group :key1, :key2, :into => :ngroups1
|
number_groups¶
Genera una variabile con il numero progressivo dei gruppi di record definiti da una o più variabili.
1 | number_groups :key1, :key2, :into => :ngroups2
|
Altre funzioni¶
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 5 | val :v1, 1
val :v1, :v2, :v3, 99
val :v2, 1, :if => {:mcr => 4}
val :v2, 1, :if => "mcr=4"
|
last¶
Restituisce l’ultimo valore valido.
1 2 | last :v1, :v2, :v3, :into => :x1
last :d5, 0, :to => :x5
|
reassign, reassign!¶
Scambia i valori di una variabile per ottenere la distribuzione indicata.
Se è attivo un peso, vengono utilizzate le distribuzioni pesate.
Argomenti aggiuntivi:
- :prop => {val1=>prop1, val2=>prop2, ...}: un hash con le coppie valore-proporzione.
I valori vengono comunque riproporzionati sulla loro somma quindi è possibile anche indicare valori assoluti o percentuali.
E’ possibile indicare solo i valori che devono essere modificati.
E’ possibile anche indicare nil o valori non attualmente esistenti nella distribuzione della variabile.- :delta => number|false: il modello converge quando la differenza massima in valore assoluto tra le percentuali ottenute e quelle desiderate è inferiore o uguale a delta (default 0.1)
- :maxit => :auto|number: il numero massimo di iterazioni. Con :auto viene calcolato automaticamente (default :auto)
- :flipflop => true|false: consente scambi inversi successivi di valori (default false). Potrebbe essere necessario attivarlo nel caso i dati siano ponderati
- :print => true|false: stampa le modifiche ai valori effettuale (default true)
- :flag => :varname|[:varname, value]|{:varname => value}: il nome e il valore di una variabile per identificare i casi modificati
La variante reassign! ignora il parametro :delta e non effettua nessun controllo sul risultato ottenuto.
1 2 3 | reassign :v1, :prop => {1=>0.05, 2=>0.25, 3=>0.30, 4=>0.40}
reassign :v1, :prop => {2=>25, 4=>40}
reassign! :v1, :prop => {nil=>15, 3=>90, 4=>120}
|