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 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
5
val :v1, 1
val :v1, :v2, :v3, 99

val :v2, 1, :if => {:mcr => 4}
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

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_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 e il suo contenuto in variabile datetime.

Argomenti aggiuntivi:

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

to_t

Converte la variabile string e il suo contenuto in variabile timeonly.

Attenzione: attualmente il formato timeonly è usato unicamente per la scrittura di file Xlsx.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale (default 8)
1
2
to_t :strtime, :into => :time1
to_t :hms, :into => :time2

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

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

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 "

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

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

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 giorni 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

ymd

Genera una variabile date a partire da anno, mese e giorno.

Argomenti aggiuntivi:

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

ymdhms

Genera una variabile datetime a partire da anno, mese, giorno, ore, minuti e secondi.

Argomenti aggiuntivi:

  • size: (opzionale) la dimensione della variabile finale (default 20)
1
2
ymdhms :anno, :mese, :giorno, :ore, :minuti, :secondi, :into => :datetime1
ymdhms :anno, :mese, :giorno, :ore, :minuti, 0, :into => :datetime2

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