Gestione variabili¶
Per le espressioni vedi anche Espressioni
rename¶
Rinomina le variabili.
1 2 3 4 5 | rename old_name_list => new_name_list
rename :sesso => :sex
rename [:sesso, :d1, 'd5.1'] => [:sex, :d100, :d5]
rename s(:d8_,7) => s(:x8_,7)
|
label¶
Imposta l’etichetta della variabile. [1]
1 2 3 4 5 | label var => label, varlist => label
label :sex => "Sesso dell'intervistato"
label :sex => "SESSO", :area => "MACROAREA"
label [:mcr1, :mcr2, :mcr3] => "MACROAREA"
|
levels¶
Imposta le etichette dei livelli. [1]
1 2 3 4 5 6 7 8 9 10 | levels var => labels, ...
levels :sesso => ['M', 'F']
levels var => {level => label, level => label}, ...
levels :area => {3 => "CENTRO", 4 => "Sud e Isole"}
levels :sesso => ['M', 'F'], :area => {3 => "CENTRO", 4 => "Sud e Isole"}
levels varlist => ...
levels s(:r100,8) => ["Sì", "No"]
|
add_levels¶
Aggiunge nuovi livelli alle variabili in coda a quelli esistenti.
1 2 3 4 5 | add_levels varlist => levels
add_levels :v1 => ["Non sa", "Non risponde"]
add_levels [:v10,:v20] => "Non sa"
add_levels s(:v3_,10) => "Rosso"
|
copy_label¶
Etichetta una o più variabili con l’etichetta di un’altra variabile.
1 2 3 4 | copy_label var => varlist
copy_label :v1 => :r1
copy_label :v1 => [:r11, :r12, :r13]
|
copy_levels¶
Etichetta i livelli di una o più variabili con le etichette dei livelli di un’altra variabile.
1 2 3 4 | copy_levels var => varlist
copy_levels :v1 => :r1
copy_levels :v1 => [:r11, :r12, :r13]
|
lprefix¶
Aggiunge un prefisso alle etichette dei livelli della variabile.
1 2 3 4 | lprefix varlist => prefix
lprefix :v123 => "Kg. "
lprefix [:v123.1,:v123.2] => "Kg. "
|
lsuffix¶
Aggiunge un suffisso alle etichette dei livelli della variabile.
1 2 3 4 | lsuffix varlist => suffix
lsuffix :etaf => " anni"
lsuffix [:eta1f, :eta2f, :eta3f] => " anni"
|
level_to_label¶
Copia l’etichetta di livello come etichetta della variabile.
1 2 3 | level_to_label varlist, level_id
level_to_label s(d7_,10), 1
|
label_to_level¶
Copia l’etichetta della variabile come etichetta di un livello.
1 2 3 | label_to_level varlist, level_id
label_to_level s(d7_,10), 1
|
factor¶
Trasforma una variabile numerica in factor e imposta le etichette. La variabile deve contenere numeri interi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | factor :etacon, :n7, :d1 # solo trasformazione in factor
factor :etacon => "Età puntuale", # con etichetta variabile
:sesso => ["SESSO", {1 => "M", 2 => "F"}], # con etichette variabile e livelli
:d1 => ["A","B","C","D"] # solo etichette livelli
factor :area => ["AREA GEOGRAFICA", ["NO", "NE", "C", "S"]]
factor s(:d7_,10) => ["Sì","No"] # più variabili con gli stessi livelli
factor :n1, :n2, :fill => true # controlla i valori esistenti nei dati e genera la sequenza di codici fino al valore più alto
factor :d1 => ["X","Y","Z"]
# equivale a:
factor :d1 => {1=>"X", 2=>"Y", 3=>"Z"}
|
Avvertimento
E’ necessario porre particolare attenzione ai casi in cui la variabile da trasformare non presenta una sequenza di valori continui che partono da 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | Se la variabile v1 contiene i valori: 2, 4 e 5:
v1
# < N. % >
2 1 93 43.66
4 2 50 23.47
5 3 70 32.86
N. NA 213 100.00
factor :v1
# produce il warning:
+ trovati 3 livelli per la variabile <v1>: 2, 4, 5 (ATTENZIONE: i codici dei livelli non corrispondono ai valori originari)
# e genera una variabile factor corretta, ma dove la sequenda dei livelli non corrisponde più ai valori:
v1
# < N. % >
2 1 93 43.66
4 2 50 23.47
5 3 70 32.86
N. NA 213 100.00
factor :v1 => {4=>"D", 5=>"E"}
# produce l'errore:
- Errore nella sintassi del comando <factor>: [v1] i livelli (4,5) non corrispondono ai valori trovati (2,4,5).
factor :v1 => ["B", "D", "E"]
# produce l'errore:
- Errore nella sintassi del comando <factor>: [v5] i livelli (1,2,3) non corrispondono ai valori trovati (2,4,5).
# equivale infatti a:
factor :v1 => {1=>"B", 2=>"D", 3=>"E"}
factor :v1 => {2=>"B", 4=>"D", 5=>"E"}
# produce il warning:
+ trovati 3 livelli per la variabile <v1>: B, D, E (ATTENZIONE: i codici dei livelli non corrispondono ai valori originari)
# e genera una variabile factor corretta, ma dove la sequenda dei livelli non corrisponde più ai valori:
v1
# < N. % >
B 1 93 43.66
D 2 50 23.47
E 3 70 32.86
N. NA 213 100.00
factor :v1 => {1=>"A", 2=>"B", 3=>"C", 4=>"D", 5=>"E"}
# genera una variabile factor completa anche dei livelli mancanti:
v1
# < N. % >
A 1 0 0.00
B 2 93 43.66
C 3 0 0.00
D 4 50 23.47
E 5 70 32.86
N. NA 213 100.00
factor :v1, :fill => true
# genera una variabile factor completa anche dei livelli mancanti e con le etichette uguali ai valori:
v1
# < N. % >
1 1 0 0.00
2 2 93 43.66
3 3 0 0.00
4 4 50 23.47
5 5 70 32.86
N. NA 213 100.00
|
numeric¶
Trasforma una o più variabili factor in variabili numeriche.
1 2 3 | numeric varlist => new_varlist
numeric s(:d6_,10) => s(:x6_,10)
|
string¶
Trasforma una o più variabili factor in variabili stringa.
1 2 3 | string varlist => new_varlist
string s(:d6_,10) => s(:txt6_,10)
|
create¶
Genera una nuova variabile senza dati. Utilizza la stessa sintassi di factor. Le variabili per cui non si specificano etichette, vengono definite come numeriche.
delete¶
Cancella le variabili elencate.
keep¶
Tiene solo le variabili elencate.
copy¶
Fa una copia di una variabile esistente.
1 2 3 | copy oldvar => newvar
copy :d1 => :d1bis, :d2 => :d2bis
copy [:d1, :d2] => [:d1bis, :d2bis]
|
missing¶
Ricodifica a blank i codici indicati delle variabili.
1 2 3 4 5 | missing var => value list, :drop => true
missing :d1 => 9
missing :d1 => [8, 9], :drop => true
missing 'd10.1' => [8,9], :d2 => 9
missing :d1 => "non so"
|
Se si indica più di un valore, i valori vanno messi tra parentesi quadre (Array). :drop => true elimina i livelli della variabile che hanno frequenza uguale a zero; in caso contrario il livello compare comunque con frequenza 0 nella tabella. Se si utilizza l’etichetta, questa deve essere esattamente uguale, compresi spazi e maiuscolo/minuscolo.
drop_levels¶
Elimina tutti i livelli della variabile che hanno frequenza uguale a zero.
1 2 3 4 | drop_levels varlist
drop_levels :d1
drop_levels [:d1, :d2, :d3]
drop_levels s(:x10_,8)
|
na_if¶
Imposta le variabili a blank se è vera la condizione. Se la condizione non è specificata, l’struzione agisce su tutti i casi.
1 2 3 4 | na_if varlist[, expression]
na_if :d1, :sesso => 1
na_if :d2
|
value¶
Assegna alle variabili i valori specificati. Accetta un solo valore per tutte le variabili o una lista di valori, uno per ciascuna variabile.
1 2 3 4 5 6 | value varlist, valuelist
create :x1
value :x1, 1
value [:v1, :v2, :v3], 99
value [:v11, :v12, :v13], [6,7,8]
|
value_if¶
Imposta le variabili uguali al valore se è vera la condizione. Accetta un solo valore per tutte le variabili o una lista di valori, uno per ciascuna variabile. Se la condizione non è specificata, l’struzione agisce su tutti i casi comportandosi come l’istruzione value.
1 2 3 4 5 6 | value_if varlist, valuelist[, expression]
value_if :d5, 1, :d5 => :na
value_if s(:d7_10), 1, :d6 => 1
add_levels :d8 => "Non risponde"
value_if [:d8, :x8], [6,99] :d8 => :na
|
na_to_level¶
1 | na_to_level "NON SO", :d5
|
recode¶
Ricodifica una variabile.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # con elenco di valori (pesi): ricodifica in una variabile numerica
recode var => [value list]
recode :d5 => [0, 10, 25, 50, 100]
recode :d5 => [NA, 10, 25, 50, 100]
# con stringa di ricodifica
recode var => expression, labels => []
recode :d5 => "1=NA;2:3=2;4:5=1", :labels => ["Sì", "No"]
recode :d5 => "NA=6", :labels => get_levels(:d5)+["Non si applica"] # vecchie etichette + nuova etichetta
recode :d5 => "3=NA", :labels => get_levels(:d5).ids(1,2,4,5) # elimino livello 3
recode :country => "c(15,44)=1;c(8,9,18,14,26,29,35)=2;c(24,40,42)=3;c(1,25,37,49)=4;else=NA"
recode s(:d2_,15) => 'NA=11', :labels => ['1','2','3','4','5','6','7','8','9','10','NON SO']
recode :x => "lo:1.10=1;1.11:1.20=2;1.21:hi=3", :labels => ["Basso", "Medio", "Alto"], :into => :y
# con indicazione del numero complessivo di livelli
recode s(:d2_,15) => 'NA=11', :nlevels => 11
# ricodifica in una nuova variabile
recode :d5 => "1=NA;2:3=2;4:5=1", :labels => ["Sì", "No"], :into => :d5bis
recode :v100 => "1:3=1;else=0", :into => :v100_1 # else comprende anche le mancate risposte (NA)
recode :v100 => "1:3=1;NA=NA;else=0", :into => :v100_1 # non ricodifica le mancate risposte
# più variabili
recode [:d5, :d6] => "1=NA;2:3=2;4:5=1", :labels => ["Sì", "No"], :into => [:r5, :r6]
# con condizione: la variabile ottenuta è numerica
recode :n100 => "5:hi=5", :if => {:sesso => 1}
recode :n100 => "5:hi=5", :if => "#sesso == 1"
recode :n120 => "1=NA", :if => "etanum >= 18"
|
interaction¶
Combina i livelli di due o più fattori in un’unica variabile.
1 2 3 4 | interaction newvar => [varlist], :sep => "string", :label => "label"
interaction :mcrsexeta => [:mcr, :sesso, :eta] # Il separatore di default per le etichette è ": ".
interaction :sexeta => [:sesso, :eta], :sep => " - ", :label => "CLASSI DI ETA' PER SESSO"
|
expand¶
Genera un set di variabili dummy da una variabile factor. Le variabili generate sono di tipo numerico, non factor. Le nuove variabili vengono etichettate con l’etichetta del livello corrispondente.
1 2 3 | expand varname => new_var_root
expand :eta => :age_ # genera: age_1, age_2, age_3, ecc.
|
compress¶
Genera una variabile factor da più variabili. Il caso più comune è la ricostruzione di una variabile singola a partire da variabili dummy che in realtà non sono multiple.
Se non si specifica il parametro :codes, viene utilizzato il codice 1. E’ possibile utilizzare anche un codice diverso per ciascuna variabile.
I valori vengono attribuiti seguendo l’ordine in cui sono state elencate le variabili. In caso di sovrapposizione, i nuovi valori sovrascrivere le precedenti assegnazioni.
Le etichette dei livelli delle nuove variabili, vengono prese dai livelli delle variabili originarie, nel caso di variabili factor, oppure dall’etichetta della variabile, nel caso di variabili numeriche.
1 2 3 4 5 | compress varlist => [newvar, "label"], :codes => value|valuelist
compress s(:eta_,5) => [:eta, "ETA'"]
compress s(:eta_,5) => [:eta, "ETA'"], :codes => 1
compress s(:eta_,5) => [:eta, "ETA'"], :codes => [1,2,3,4,5]
|
mc_to_md¶
Trasforma un set di variabili multicategory in un set di variabili multidicotomy. Restituisce l’elenco delle variabili create.
1 2 3 4 | mc_to_md varlist => new_vars_root
mc_to_md s(:d5_,10) => :x5_
mc_to_md s(:d5_,10) => 'x5.'
|
md_to_panel¶
Trasforma un set di variabili multidicotomy in nuove variabili adatte ad essere utilizzate nel pannello. Le variabili generate sono variabili factor con un unico livello etichettato con l’etichetta della variabile originaria. Se non viene specificato l’elenco delle variabili di destinazione, i nomi delle variabili vengono generate automaticamente. Se non viene specificato il codice delle variabili multidicotomy, viene utilizzato il valore 1. Restituisce l’elenco delle variabili create.
1 2 3 4 5 6 7 8 | md_to_panel varlist, label, new_varlist, code
md_to_panel s(:v10_,1..3,8,9), "POSSESSO BENI", s(:beni_,5), 1
# poi, nel pannello
panels.add :_t, :sesso, s(:beni_,5) :area
# oppure direttamente nell'istruzione panels.add anche senza specificare i nomi
panels.add :_t, :sesso, md_to_panel(s(:v10_,1..3,8,9), "POSSESSO BENI"), :area
|
reorder¶
Riordina i livelli di una variabile factor riordinando anche le etichette.
- un vettore con l’elenco dei livelli ordina la variabile in modo arbitrario
- :rev invertire l’ordine dei livelli
- :freq ordina in base alle frequenze in senso crescente
- :dfreq ordinare in base alle frequenze in senso decrescente
Se è attiva una variabile di ponderazione vengono considerate le frequenze pesate.
1 2 3 4 5 6 7 8 9 10 11 | # riordina i livelli della variabile v1
reorder :v1, 3, 2, 5, 4, 1
# inverte l'ordine dei livelli della variabile v1
reorder :v1, :rev
# riordina i livelli in base alle frequenze
reorder :v1, :freq
# riordina i livelli in base alle frequenze in senso decrescente
reorder :v1, :dfreq
|
switch¶
Scambia due livelli di una variabile factor scambiando anche le etichette.
1 2 | # inverte il codice 70 della variabile v30 con il 75
switch :v30, 70, 75
|
move_before¶
Sposta dei livelli di una variabile factor prima di un determinato livello. Riordina anche le etichette.
1 2 3 4 5 | # sposta il livello 1 prima del livello 6
move_before :v100, 1, 6
# sposta i livelli 4, 6 e 7 prima del livello 1
move_before :v100, [4,6,7], 1
|
move_after¶
Sposta dei livelli di una variabile factor dopo di un determinato livello. Riordina anche le etichette.
1 2 3 4 5 | # sposta il livello 1 dopo il livello 6
move_after :v100, 1, 6
# sposta i livelli 5, 6 e 7 dopo il livello 1
move_after :v100, 5..7, 1
|
if_any¶
Crea una nuova variabile che è ugnale a 1 se almeno una delle variabili contiene il valore indicato e 0 in caso contrario.
1 2 | if_any variables_list, code, new_var, label
if_any [:d7_2, :d7_3], 1, :x7, "EMOZIONI"
|
if_all¶
Crea una nuova variabile che è ugnale a 1 se tutte le variabili contengono il valore indicato e 0 in caso contrario.
1 2 | if_all variables_list, code, new_var, label
if_all s(:d7_,5..8), 1, :x7, "Sia ... sia ..."
|
if_none¶
Crea una nuova variabile che è ugnale a 1 se tutte le variabili non contengono il valore indicato e 0 in caso contrario.
1 2 | if_none variables_list, code, new_var, label
if_none s(:d7_,10), 1, :x7
|
if_only¶
Crea una nuova variabile che è ugnale a 1 se almeno una delle variabili del primo set contiene il valore indicato mentre nessuna delle variabili dell’altro set lo contengono. Il secondo set può anche contenere tutto l’insieme delle variabili, pTabs provvederà a sottrarre le variabili del primo set.
1 2 | if_only variables_list_1, code, variables_list_2, new_var, label
if_only [:d7_3,:d7_5], 1, s(:d7_,1..10), :x7, "Solo 3 o 5"
|
split_vars¶
Crea nuove variabili uguali alle variabili di partenza, ma che contengono solo i gruppi di casi definiti da una data variabile. Restituisce un vettore con i nomi delle variabili create.
Con :names è possibile definire un modello per i nomi delle nuove variabili: # è il segnaposto per il livello della variabile che definisce i gruppi, ## è il segnaposto per il nome della variabile di origine. Se :names non viene specificato, i nomi vengono generati automaticamente secondo il modello NomeVariabileGruppi_#_##.
1 2 3 4 5 6 7 | split_vars variable_group => variables_list, :names => template
# crea delle copie delle variabili per ciascun livello di :sesso
split_vars :sesso => [:d1,:d2]+s(:d7_,10), :names => "##_sex#"
# assegna a varlist l'elenco delle variabili create
varlist = split_vars :sesso => [:d1,:d2]+s(:d7_,10)
|
derotate¶
Attenzione
Funzionalità in test. Verificare il risultato.
Scambia le risposte tra diversi set di variabili secondo la rotazione di appartenenza di ciascun caso.
Le rotazioni possono essere definite in due modi:
- da una variabile numerica o factor che indica l’appartenenza del record a una rotazione (cella). In tal caso è necessario specificare anche il parametro :rot.
- da una serie di variabili numeriche o factor che indicano le varie permutazioni. Ogni variabile identifica l’oggetto di ciascun set di domande somministrate. Il numero di queste variabili deve essere uguale al numero di set di variabili da derotare. Il parametro :rot non deve essere specificato (il dataset contiene le informazioni necessarie).
:rot specifica lo schema delle rotazioni. E’ un vettore che, per ciascun livello/valore della variabile che identifica la rotazione, contiene la sequenza di rotazione.
Le variabili da derotare sono un vettore di vettori di nomi di variabili: [ [:x1, :y1, :z1], [:x2, :y2, :z2], ... ].
Nell’esempio, le ipotetiche domande a e b vengono ripetute per tre volte per testare tre diversi oggetti. Le domande vengono somministrate ai vari soggetti in quattro diverse sequenze. E’ da notare che il numero di oggetti da testare e il numero di permutazioni non sono necessariamente uguali.
1 | derotate variable_id_rotazione|variables_list_sequenza => variables_list, :rot => schema
|
1 2 3 4 5 6 7 8 9 10 11 12 | # l'elenco delle variabili da derotare, memorizzato per comodità nella variabile varlist
varlist = [ [:a1]+s(:b1_,10),
[:a2]+s(:b2_,10),
[:a3]+s(:b3_,10) ]
# ...oppure, più sinteticamente:
varlist = 3.rep.map { |i| ["a#{i}"]+s("b#{i}_",10) }
# ...il vettore multidimensionale risultante:
[ ["a1", "b1_1", "b1_2", "b1_3", "b1_4", "b1_5", "b1_6", "b1_7", "b1_8", "b1_9", "b1_10"],
["a2", "b2_1", "b2_2", "b2_3", "b2_4", "b2_5", "b2_6", "b2_7", "b2_8", "b2_9", "b2_10"],
["a3", "b3_1", "b3_2", "b3_3", "b3_4", "b3_5", "b3_6", "b3_7", "b3_8", "b3_9", "b3_10"] ]
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Metodo 1: con id rotazione
# :rotazione è la variabile che identifica la rotazione/cella
rotazione
1 2
2 4
3 3
4 1
5 1
6 2
...
# rot_schema contiene l'elenco delle permutazioni utilizzate
# (deve corrispondere ai livelli della variabile :rotazione)
rot_schema = [ [1,2,3], # per :rotazione = 1
[2,3,1], # per :rotazione = 2
[3,1,2], # per :rotazione = 3
[1,3,2] ] # per :rotazione = 4
derotate :rotaz => varlist, :rot => rot_schema
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Metodo 2: con variabili sequenza
# le variabili :ro1, :ro2 e :ro3 contengono la sequenza degli elementi (l'ordine dei test)
# della permutazione utilizzata
ro1 ro2 ro3
1 2 3 1
2 1 3 2
3 3 1 2
4 1 2 3
5 1 2 3
6 2 3 1
...
derotate s(:ro,3) => varlist
|
fill¶
Genera dati casuali. E’ utile per svolgere simulazioni e test di tavole. Per le variabili factor vengono generati i valori corrispondenti ai livelli della variabile. Per le variabili numeriche è necessario specificare il range di valori. Vengono generati solo valori interi.
Nel caso sia impostato filter, fill genera valori per i soli casi non filtrati.
Opzioni:
- :range: vettore con il valore minimo e il valore massimo. Solo per numeriche.
- :cases: :na (default) genera valori solo per i casi in cui la variabile è missing, :valid genera valori solo per i casi in cui la variabile ha un valore, :all genera valori per tutti i casi
- :probs: vettore con le probabilità di estrazione per ciascun valore da estrarre. Devono essere in numero uguale ai diversi valori da generare. Il parametro :auto calcola automaticamente le probabilità in base alla distribuzione dei casi validi della variabile (casi filtrati se è attivo un filtro).
- :seed: un numero intero che viene usato come seed per la generazione dei valori casuali
Quando viene fornito il parametro :probs e non il parametro :seed, viene calcolata iterativamente la soluzione migliore.
1 2 3 4 5 6 7 8 | fill :d1
fill :sesso, :probs => [45, 55]
fill :area, :probs => [0.2, 0.2, 0.5, 0.1]
fill :v100, :range => [1,10], :cases => :all
fill :v4500, :cases => :na, :probs => :auto
filter :sesso => 1, :label => "Maschi"
fill :v221, :seed => 3
|
Produce nell’output una tabella con le distribuzioni di frequenze dei valori iniziali della variabile, dei valori generati e dei valori finali:
> fill :x1, :range => [1,2], :cases => :na
Fill x1
Value Pre -> Gen -> Post
1 1 NA 66 66
2 2 NA 80 80
3 9 154 NA 154
4 <NA> 146 0 0
seed¶
Imposta il seed per la generazione delle sequenze di numeri casuali. Permette la riproducibilità delle sequenze di numeri casuali.
1 | seed 2
|
Note
[1] | (1, 2) Nelle etichette delle variabili di pannello è possibile utilizzare il carattere _ (parametro :hyphen_char) e | (parametro :break_char). Sono utili nei pannelli dell’output di testo: il primo inserisce il trattino e manda a capo l’etichetta, il secondo va a capo senza inserire il trattino. Negli altri formati vengono ignorati ed eliminati. |