Variabili: trasformazioni (2)¶
Nota
Per le espressioni vedi anche Espressioni
value¶
Assegna alle variabili i valori specificati. Accetta un solo valore per tutte le variabili o una lista di valori, uno per ciascuna variabile. Se le variabili non esistono, verranno create.
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]
|
one, zero, void¶
Assegnano rispettivamente 1, 0 e valore mancante alle variabili specificate. Se le variabili non esistono, verranno create.
1 2 3 | one :a1
zero :b1, :b2, :b3
void s(:c,5)
|
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 le variabili non esistono, verranno create.
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_if¶
Imposta le variabili a blank se è vera la condizione. Se le variabili non esistono, verranno create.
1 2 3 | na_if varlist, expression
na_if :d1, :sesso => 1
|
timediff¶
Crea una variabile con la differenza tra due variabili data o data e ora. Con due variabili di tipo :date restituisce il numero di giorni e imposta la variabile come :integer. Con due variabili di tipo :datetime restituisce il numero di secondi e imposta la variabile come :time. Quando una variabile è di tipo :date e una di tipo :datetime viene considerata la sola data per entrambe le variabili.
1 2 3 | timediff :diff1, :giorno, :giorno2, :label => "Giorni"
timediff :diff2, :ora, :ora2, :label => "Ore" # viene impostata come :time
timediff :diff3, :ora, :ora2, :label => "Numero secondi", :type => :float # forza il tipo a :float
|
count¶
Crea una variabile con il conteggio delle occorrenze di uno o più valori.
Argomenti:
- nome variabile: il nome della variabile in cui memorizzare il risultato (se la variabile non esiste, verrà creata).
- lista valori: un valore o un vettore di valori. E’ possibile indicare il valore mancante con nil o con :na.
- lista variabili: l’elenco delle variabili in cui contare le occorrenze dei valori.
1 2 3 4 | count :nmiss, [nil,99,999], :sex, :area, :studio, :abb
count :c6a, 3, s(:d6_,10)
count :c6b, nil, s(:d6_,10)
count :c6c, [nil,0], s(:d6_,10)
|
compute¶
Assegna il risultato dell’espressione alla variabile. Se la variabile non esiste, verrà creata, altrimenti i valori verranno sovrascritti.
Argomenti:
- lista variabili => espressione: è possibile utilizzare una sola variabile oppure un array con più nomi di variabili.
- type => symbol: il tipo della variabile
- size => number: la dimensione della variabile
- ndec => number: il numero dei decimali della variabile
- label => string: l’etichetta della variabile
- labels => hash: le etichette dei livelli della variabile
- w => array|hash: un array o un hash con i pesi da utilizzare al posto dei valori nel calcolo del risultato. In caso di mancata corrispondenza tra valore e peso, verà attribuito il valore nil
Per la sintassi, vedere la sezione Espressioni. Inoltre compute accetta le seguenti funzioni:
- N(): il numero totale di records)
- NROW(): il numero progressivo di record; base 1)
- LABEL(varname): l’etichetta della variabile
- LEVEL(varname): l’etichetta del valore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | compute :d5bis => :d5
compute :d5bis => "d5"
compute :id => "NROW()"
compute :x5 => "IF(d5,d5+1,nil)"
compute :x100 => "SUM(d101,d102,50)"
compute :n7 => "IF(ALL(0,#{s(:d7_,10).join(',')}),1,null)", labels: {1=>"NESSUNA CITAZIONE"}
compute :a2 => "UPCASE(TEXT(a2))", type: :string, size: 50
compute :x0 => "MAX(q21, q22, q23, q24)"
compute :pr => "NROW()/N()*100"
compute :x3 => "CONCAT(LABEL(d5), ' ', LEVEL(d5))"
compute :x3 => nil
compute :x3 => :na
compute :x5 => {:d5 => [0,1,2]} # equivale a:
compute :x5 => "IF(ANY(d5,0,1,2),1,nil)"
|
E’ possibile definire nuove funzioni con il metodo add_function.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # se ci sono almeno 3 valori 5 nella batteria di items mette 1 altrimenti 0
add_function(:more3, :number, ->(*args) {
args.compact.select{|x| x == 5}.count >= 3 ? 1 : 0
})
# Eesempi di implementazione di funzioni esistenti:
# COUNT
add_function(:count, :integer, ->(value, *args) {
args.compact.select{|x| x == value}.count
})
# TITLEIZE
add_function(:titleize, :string, ->(value) {
(value||'').to_s.split(' ').map{|x| x.capitalize}.join(' ')
})
# ROUND
add_function(:round, :numeric, ->(numeric, places=nil) {
numeric ? numeric.round(places||0) : nil
})
|
recode¶
Ricodifica i valori delle variabili. Le etichette dei valori non vengono modificate.
Argomenti:
- lista variabili => ricodifiche: è possibile utilizzare una sola variabile oppure un array con più nomi di variabili. Le ricodifiche sono un hash di coppie valori da ricodificare/nuovo valore. E’ possibile passare i valori da ricodificare come singolo elemento, array, range o anche un array contenete altri array e range.
- :into permette di specificare il nome o i nomi delle nuove variabile in cui ricodificare i dati. Il numero di variabili deve corrispondere al numero di variabili da ricodificare. Se non specificato :into, vengono ricodificate le variabili originarie.
- :else identifica tutti i valori non elencati precedentemente.
- :else => :copy copia i valori non elencati precedentemente (default se non è specificato :into).
- :else => :delete elimina i valori non elencati precedentemente (default se è specificato :into).
- type => symbol: il tipo della variabile
- size => number: la dimensione della variabile
- ndec => number: il numero dei decimali della variabile
- label => string: l’etichetta della variabile
- labels => hash: le etichette dei livelli della variabile
- if => expression: filtro per applicare le ricodifiche sono in un sottoinsieme di casi
Per le variabili stringa i valori possono essere specificati come stringa ('text' o "text") oppure come espressione regolare (/regex/). Il confronto con viene fatto eliminando nei dati gli spazi iniziali e finali. Nel caso di valori stringa il confronto è case insensitivi.
Quando si ricodificano variabili stringhe in una variabile numerica, i valori stringa da ricodificare sono usati come etichette della variabile numerica.
1 2 3 4 5 6 7 8 9 10 | recode :x1 => {0 => nil}
recode :x2 => {(1..3) => 5, [4,5] => 1, :else => :delete}
recode :x3 => {1..3 => 5, [4,5] => 1, 6 => 2, :else => :copy}, :into => :z1
recode :x4 => {"NO" => 1, "NE"=> 2, "C"=> 3, "S"=> 4}, into: :area
recode :x5 => {/^[molto|abbastanza].+$/i => 1, :else => 0}, into: :x5b
recode :x6 => { [11,14,[15,16],20..24,34] => 1, 28..31 => 2 }
recode s(:c15_,1..10) => {nil=>nil, 0=>0, :else=>1}, :labels => {}
|
classify¶
Ricodifica i valori delle variabili discrete in classi.
Argomenti:
- lista variabili => ricodifiche: è possibile utilizzare una sola variabile oppure un array con più nomi di variabili. Le ricodifiche sono un hash di coppie valori da ricodificare/etichetta. E’ possibile passare i valori da ricodificare come singolo elemento, array o range. I nuovi valori verranno attribuiti consecutivamente a partire da 1. Eventuali valori che non rientrano nelle classi specificate verranno riportati
- :into: permette di specificare il nome o i nomi delle nuove variabile in cui ricodificare i dati. Il numero di variabili deve corrispondere al numero di variabili da ricodificare. Se non specificato :into, vengono ricodificate le variabili originarie.
- :else: identifica tutti i valori non elencati precedentemente.
- :else => :copy: copia i valori non elencati precedentemente (default se non è specificato :into).
- :else => :delete: elimina i valori non elencati precedentemente (default se è specificato :into).
1 | classify :q12 => {1 => "1 sola uscita", 2..5 => "2/ 5 uscite", 6..10 => "6/10 uscite ", :else => "Più di 10 uscite"}
|
bins¶
Ricodifica i valori di una variabile continua in classi.
Argomenti:
- variabile di origine => variabile di destinazione
- :floor => []: la lista dei valori che devono essere considerati come limiti inferiori delle classi
- :ceiling => []: la lista dei valori che devono essere considerati come limiti superiori delle classi
- :labels => []: la lista delle etichette delle classi
- :label => "": l’etichetta della nuova variabile
I parametri :fool e :ceiling non possono essere indicati contemporaneamente. I valori devono essere uguali al numero di classi da creare meno uno.
1 | bins :spesa => :spesa2, :floor => [2.5, 4.5, 7.5], :labels => ["Meno di 2,50 ", "Da 2,50 a 4.49 ", "Da 4,50 a 7.49 ", "7,50 o più"]
|
tiles¶
Ricodifica i valori delle variabili in percentili.
- lista variabili: è possibile utilizzare una sola variabile oppure un array con più nomi di variabili.
- perc: i percentili da utilizzare. Default [25,50,75,100], i quartili. E’ possibile omettere il 100 finale.
- :into: permette di specificare il nome o i nomi delle nuove variabile in cui ricodificare i dati. Il numero di variabili deve corrispondere al numero di variabili da ricodificare. Se non specificato :into, vengono ricodificate le variabili originarie.
- :label: l’etichetta della variabile. Se non specificata utilizza l’etichetta della variabile originaria.
- :labels: le etichette dei livelli della variabile. E’ possibile specificarle esplicitamente (con un vettore o un hash) oppure specificare un template per comporre l’etichetta, dove %(x) indica il valore inferiore della classe, %(y) il valore superiore e %(#) il progressivo delle classi. Se non indicato il template di default è "%(x)-%(y)".
- :w => false: utilizza i valori grezzi anche in caso di ponderazione attiva.
- lista codici => "etichetta": è possibile indicare uno o più codici che devono essere ignorati nel calcolo. Se viene specificata un’etichetta verranno ricodificati nella nuova variabile (utilizzando il primo codice disponibile), se specificato nil i valori verranno ricodificati a blanck. E’ possibile indicare più coppie valori/etichetta-nil.
1 2 | tiles :euro, :perc => [25,50,75], :into => :prezzo
tiles :v100, :labels => "%(#)° quartile (%(x)-%(y))", 0 => "NON INDICA", [97,98] => "NON RISPONDE", 9999 => nil, :w => false
|
lump¶
Aggrega i livelli più piccoli di una variabile in un unico gruppo.
Argomenti:
- varlist: l’elenco dei nomi delle variabili
- il criterio di aggregazione dei livelli:
- se non specificato, aggrega i livelli in modo che il nuovo gruppo non sia superiore per numerosità a nessuno dei gruppi residui
- :nlev => #: un numero che indica il numero complessivo finale di livelli
- :plev => #.#: un numero che indica la percentuale massima che può avere il nuovo livello
- :n => #: il livello verrà aggregato se ha una numerosità minore o uguale a quella indicata
- :perc => #.#: il livello verrà aggregato se ha una frequenza percentuale minore o uguale a quella indicata
- :ord => :ini|:end: i livelli vengono aggregati seguendo l’ordine originario, a partire dall’estremità inferiore (:ini) o da quella superiore (:end)
- :code: il codice del nuovo livello (default: il valore successivo/precedente rispetto ai codici della variabile)
- :label: l’etichetta del nuovo livello altrimenti concatena le etichette dei livelli che vengono aggregati
- :renumber|:renum => true|false: rinumera i livelli della variabile a partire da 1 (default: false)
- :into => namelist: i nomi delle nuove variabili se non si vuole modificare quelle originali
1 2 3 4 5 6 7 | lump :v1
lump :v2, :v3, :nlev => 3
lump :v4, :prop => 0.20, :code => 9, :label => "Altro"
lump s(:v32,5), :n => 10, :into => s(:x32,5), :renum => true
|