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