Variabili: etichette e livelli

In relazione alle etichette delle variabile si veda anche File di dati>Metadati e le funzioni get_label, get_labels, get_levels, get_levels.

Un modo per lavorare sulle etichette senza doverle ridigitare, è quello di far stampare le vecchie etichette e incollarle nello script:

1
2
3
4
p get_levels(:titolo) # => stampa nel log: {1=>"nessun titolo-elementare", 2=>"Media inferiore", 3=>"Media superiore", 4=>"Laurea"}

# copia e incolla nello script per modificarle:
levels :titolo => {1=>"Nessun titolo/Elementare", 2=>"Media inferiore", 3=>"Media superiore", 4=>"Laurea"}

label

Imposta l’etichetta della variabile o dell’elenco di variabili.

E’ possibile indicare un elenco di variabili e un’etichetta o un’elenco di etichette pari al numero delle variabili. E’ possibile elencare più coppie variabile/i => etichetta.

La variante label? non dà errore se la variabile non esiste.

Argomenti:

  • varlist => label|labels: il nome della variabile o l’elenco dei nomi delle variabili e l’etichetta o l’elenco delle etichette corrispondenti a ciascuna variabile
1
2
3
4
5
6
 label :sex => "Sesso dell'intervistato"
 label :sex => "SESSO", :area => "MACROAREA"
 label [:mcr1, :mcr2, :mcr3] => "MACROAREA"

 label [:sex, :eta, :mcr] => ["Sesso", "Età", "Macroarea"]
 label s(:v1_, 1..5) => ["Label 1", "Label 2", "Label 3", "Label 4", "Label 5"]

levels

Imposta le etichette dei livelli.

La variante levels? non dà errore se la variabile non esiste.

Argomenti:

  • varlist => levels: il nome della variabile o l’elenco dei nomi delle variabili e l’elenco dei livelli
    • il levels è possibile specificare:
      • un array [] con un elenco di etichette: i codici verranno attribuiti sequenzialmente a partire da 1
      • un hash {} con le coppie di codice e etichetta. È anche possibile specificare :else => :value per etichettare i codici non specificati semplicemente con il loro valore
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 levels :sesso => ['M', 'F']
 levels s(:r100,8) => ["Sì", "No"]

 levels :area => {1 => "Nord Ovest", 2 => "Nord Est", 3 => "Centro", 4 => "Sud e Isole"}

 levels :sesso => ['M', 'F'], :area => {1 => "Nord Ovest", 2 => "Nord Est", 3 => "Centro", 4 => "Sud e Isole"}

 levels :d100 => {1 => "1 Per niente importante", 10 => "10 Molto importante", 0 => "NA", :else => :value}

 # elimina le etichette
 levels :v1 => {}
 levels :v1 => nil
 levels :v1

add_label

Aggiunge la stringa specificata all’etichetta della variabile.

  • :sep => "" permette di specificare una stringa di separazione (default ""). Nel caso l’etichetta originaria sia vuota, non viene inserito nessun carattere di separazione
  • :pos => :left|:right specifica se la stringa deve essere messa a sinistra/inizio o a destra/fine (default :right)
1
2
3
4
5
 add_label varlist => labels, :sep => "string", :pos => :right

 add_label :v1 => " / (Totale)"
 add_label s(:v2_,3) => ["X", "Y", "Z"], :sep => "_"
 add_label :v3.to(:v10) => "SEZ.1 - ", :pos => :left

add_levels

Aggiunge o sostituisce nuove etichette di livelli.

1
2
3
4
5
 add_levels varlist => levels

 add_levels :v1 => {98 => "Non sa", 99 => "Non risponde"}
 add_levels [:v10,:v20] => {99 => "Non sa"}
 add_levels s(:v3_,10) => {7 => "Rosso"}

autolevels

Inserisce delle etichette uguali ai valori della variabile. Se la variabile ha già etichette, inserisce solo eventuali nuove etichette per livelli non ancora etichettati.

Argomenti:

  • varlist: la lista delle variabili
  • :pref => string: un prefisso da aggiungere alle etichette
  • :suff => string: un suffisso da aggiungere alle etichette

copy_label

Etichetta una o più variabili con l’etichetta di altre variabili.

1
2
3
4
5
6
 copy_label var|varlist => var|varlist

 copy_label :v1 => :r1
 copy_label :v1 => [:r11, :r12, :r13]

 copy_label [:v7_1, :v7_2, :c7_3] => [:x7_1, :x7_2, :x7_3]

copy_levels

Etichetta i livelli di una o più variabili con le etichette dei livelli di altre variabili.

1
2
3
4
5
6
 copy_levels var|varlist => var|varlist

 copy_levels :v1 => :r1
 copy_levels :v1 => [:r11, :r12, :r13]

 copy_levels [:v7_1, :v7_2, :c7_3] => [:x7_1, :x7_2, :x7_3]

copy_labels

Esegue in successione copy_label e copy_levels.

relevel

Riordina i livelli di una o più variabili riordinando anche le etichette. Agisce ricodificando i codici delle variabile.

Argomenti:

  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
  • valuelist: l’elenco dei codici della variabile nell’ordine desiderato
  • :a [,endcodes]: ordina alfabeticamente le etichette (endcodes = livelli da tenere in fondo)
  • :d [,endcodes]: ordina alfabeticamente le etichette in senso decrescente(endcodes = livelli da tenere in fondo)
  • :seq [,start]: rinumera sequenzialmente i livelli partendo da 1 o da start
  • :rev [,endcodes]: inverte l’ordine dei livelli (endcodes = livelli da tenere in fondo)
  • :freq [,endcodes]: ordina in base alle frequenze pesate in senso crescente (endcodes = livelli da tenere in fondo)
  • :dfreq [,endcodes]: ordina in base alle frequenze pesate in senso decrescente (endcodes = livelli da tenere in fondo)
  • :freq_u [,endcodes]: ordina in base alle frequenze non pesate in senso crescente (endcodes = livelli da tenere in fondo)
  • :dfreq_u [,endcodes]: ordina in base alle frequenze non pesate in senso decrescente (endcodes = livelli da tenere in fondo)
  • :top, valuelist: sposta i codici indicati all’inizio
  • :bottom, valuelist: sposta i codici indicati alla fine
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 # riordina i livelli della variabile v1
 relevel :v1, 3, 2, 5, 4, 1

 # riordina le etichette della variabile :brand in senso alfbetico, lasciando in fondo i codici 98 e 99
 relevel :brand, :a, [98,99]

 # inverte l'ordine dei livelli della variabile v2 ad eslusione del codice 9 che viene tenuto in fondo
 relevel :v2, :rev, 9

 # riordina i livelli in base alle frequenze
 relevel [:v3, :v4, :v5], :freq

 # riordina i livelli in base alle frequenze in senso decrescente
 relevel s(:101_,7), :dfreq

 # sposta i codici 5 e 7 all'inizio
 relevel :v3, :top, 7, 5

 # sposta il codice 1 in fondo
 relevel :v3, :bottom, 1

 # rinumera i livelli partendo da 1
 relevel :brand, :seq

reverse

Riordina i livelli di una o più variabili invertendo i codici e riordinando anche le etichette (cfr. relevel).

Argomenti:

  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
  • valuelist: l’elenco dei codici che devono rimanere invariati
1
2
3
4
5
 reverse :v1

 reverse s(:v2_,10), 9

 reverse :v3, 98, 99

changelev

Modifica i codici di una variabile, spostando anche le etichette (cfr. relevel).

Argomenti:

  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
  • valuepairs|list|:compact:
    • valuepairs: le coppie di codici da modificare con il vecchio e il nuovo valore
    • valuelist: la lista completa dei nuovi valori che verranno accoppiati ai livelli definiti della variabile (nel log vengono stampate le coppie di valori effettivamente utilizzate)
    • :compact: ricodifica in modo progressivo a partire da 1 i livelli della variabile
1
2
3
4
5
6
7
 changelev :d5 => {0 => 9}

 changelev :x10 => {0=>1, 1=>0}

 changelev :v100 => [2,1,0,-1,-2]

 changelev :marche => :compact

switch

Scambia due livelli di una o più variabili scambiando anche le etichette (cfr. relevel).

1
2
3
 switch :x10, 1, 0

 switch :v30, 70, 75

merge_levels

Ricodifica i valori di una variabile unendo due o più livelli.

Argomenti:

  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
  • codes: un array con la lista dei codici da unire; il nuovo livello avrà come codice il primo codice elencato
  • label: (opzionale) l’etichetta del livello (default l’etichetta del primo codice elencato)
1
2
3
merge_levels :d5, [8,9], "NA"

merge_levels s(:d1_,1..9), [9,0]

collect_levels

Unisce la definizione dei livelli di più variabili in un’unica definizione.
Non modifica i valori ma solo la definizione dei livelli.

Argomenti:

  • varlist: l’elenco dei nomi delle variabili da cui prendere le etichette
  • :into => varlist: l’elenco dei nomi delle variabili che devono essere etichettate (default varlist)
  • :order => :first|:last: in caso di livelli uguali su più variabili, :first tiene la prima etichetta, mentre :last tiene l’ultima (default :first)
  • :syntax => false|true: true stampa nel log l’istruzione per la definizione dei livelli e non la assegna a nessuna variabile (default false)
1
2
collect_levels :v1, :v2, :v3
collect_levels :v1, :v2, :v3, :into => :x1, :order => :last

collect_data

Estrae e unisce i dati contenuti in più variabili ed elimina i duplicati.
Genera un elenco di coppie valore => codice progressivo (Hash) utile per la ricodifica oppure un elenco di valori (Array).
Può essere utilizzato per ricodificare più variabili stringa con un una codifica comune.

Argomenti:

  • varlist: l’elenco dei nomi delle variabili
  • :as_array => true|false: genera un array e non un hash (default false)
  • :sort => true|false: ordina i valori trovati (default true)
  • :invert => true|false: inverte le chia con i valori dell’hash (default false)
  • :print => true|false: stampa il risultato (default true)
  • :fun => []: un array di funzioni da applicare ai dati, per esempio: :to_s, :strip, :squish, :upcase, :downcase, :titleize, :capitalize, :to_i, ecc.
1
2
3
4
recode s(:open_, 1..5) => collect_data(s(:open_, 1..5)), :into => s(:v1_, 1..5)

varlist = %w(a5 b7 b8 c2 d4, e1)
recode varlist => collect_data(varlist), :fun => [:to_s, :squish, :upcase], :into => varlist.map{|x| "r#{x}"}

add_na

Ricodifica i casi mancanti della variabile in un nuovo livello.

Argomenti:

  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
  • label: (opzionale) l’etichetta del livello (default NA)
  • codes: (opzionale) il codice del nuovo livello (default il primo livello disponibile dopo quelli esistenti)
1
2
3
 add_na :d5

 add_na :d5, "Na/Nr", 9

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)

delete_levels

Elimina le etichette dei livelli specificati della variabile. Eventuali dati presenti per quei livelli non verranno modificati.

1
2
3
4
 delete_levels :d1 => 99
 delete_levels [:d2, :d3] => 9
 delete_levels :d4 => [0,99]
 delete_levels :d5 => 97..99

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"

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

level_to_label

Copia l’etichetta di livello come etichetta della variabile.

1
2
3
 level_to_label level_id => varlist

 level_to_label 1 => s(:d7_,10)

switch_labels

Scambia l’etichetta di un livello e l’etichetta della variabile.

1
2
3
 switch_labels varlist => level_id

 switch_labels s(:d7_,10) => 1

simplify_label

Elimina da un set di variabili la parte uguale dell’etichetta.

Argomenti:

  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
  • drop_from => string|regex: (opzionale) una stringa o una espressione regolare che definisce il testo a partire dal quale l’etichetta va ripulita fino alla fine. E’ utile quando simplify_label non riesce a trovare la parte comune quando le etichette sono state troncate e il testo superfluo rimasto in fondo all’etichetta è differente per ciascuna variabile
1
2
3
4
5
 simplify_label s(:d19_,6)

 simplify_label s(:d19_,6), :drop_from => " Rispondere su una"

 simplify_label s(:d19_,6), :drop_from => / \*\(Rispondere/

simplify_levels

Elimina da un set di variabili la parte uguale dell’etichetta di uno dei livelli.

Argomenti:

  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
  • code: il codice del livello su cui agire (default 1)
  • drop_from => string|regex: (opzionale) una stringa o una espressione regolare che definisce il testo a partire dal quale l’etichetta va ripulita fino alla fine. E’ utile quando simplify_label non riesce a trovare la parte comune quando le etichette sono state troncate e il testo superfluo rimasto in fondo all’etichetta è differente per ciascuna variabile
1
2
3
 simplify_levels s(:d19_,6)

 simplify_levels s(:d19_,6), 1

label_sub

Cerca e sostituisce testo nelle etichette delle variabili. E’ possibile usare espressioni regolari e più coppie di testo da cercare / testo da sostituire.

1
2
3
4
label_sub varlist, search1 => replace1, search2 => replace2, search3 => replace3, ...

label_sub :v100, "(leggere)" => "", "(non suggerire)" => ""
label_sub s(:v10_, 1..10), /^(.*?)\((.+)\)(.*)$/ => '\1\3 [\2]'

levels_sub

Cerca e sostituisce testo nelle etichette dei livelli delle variabili. E’ possibile usare espressioni regolari e più coppie di testo da cercare / testo da sostituire.

1
2
3
4
levels_sub varlist, search1 => replace1, search2 => replace2, search3 => replace3, ...

levels_sub :v5, "favorevole" => "d'accordo"
levels_sub s(:v72_, 1..12), /^\d+\.\s*/ => ""

label_crop

Elimina i caratteri iniziali e/o finali dell’etichett1 della variabile.
Un numero positivo indica il numero di caratteri da eliminare all’inizio della stringa. Un numero negativo indica il numero di caratteri da eliminare alla fine della stringa. Se come secondo numero viene indicato un numero positivo, questo indicherà la lunghezza totale della della stringa da estrarre.
Se viene indicata una stringa, verrà eliminato tutto il testo dalla stringa fino alla fine.

1
2
3
4
5
6
7
label_crop varlist => [n1, n2]

label_crop [:v21, :v22] => [2, -10]
label_crop :v23 => 2
label_crop :v24 => -10
label_crop :v25 => [5, 3]
label_crop :v5 => " (Intervistatore"

levels_crop

Elimina i caratteri iniziali e/o finali delle etichette dei livelli.
Un numero positivo indica il numero di caratteri da eliminare all’inizio della stringa. Un numero negativo indica il numero di caratteri da eliminare alla fine della stringa. Se come secondo numero viene indicato un numero positivo, questo indicherà la lunghezza totale della della stringa da estrarre.
Se viene indicata una stringa, verrà eliminato tutto il testo dalla stringa fino alla fine.

1
2
3
4
5
6
7
levels_crop varlist => [n1, n2]

levels_crop [:v1, :v2] => [3, -5]
levels_crop :v3 => 3
levels_crop :v4 => -5
levels_crop :v5 => [5, 3]
levels_crop :v9 => " (Non leggere"

label_strip

Elimina gli spazi iniziali, finali e multipli dall’etichetta della variabile.

levels_strip

Elimina gli spazi iniziali, finali e multipli dalle etichette dei livelli.

label_apply

Applica una funzione alle etichette delle variabili.

Argomenti:

  • funz: la funzione può essere un simbolo o una stringa con il nome della funzione, oppure una lambda (funzione anonima). La lambda ha come primo argomento l’etichetta e come secondo argomento (opzionale) l’oggetto Field
  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
1
2
3
4
5
6
label_apply :strip_tags, :d1
label_apply :upcase, :sesso, :area
label_apply lambda {|x| x.upcase}, :sesso, :area
label_apply -> (x) {x.upcase}, :sesso, :area
label_apply -> (x) {"VAR: "+ x}, :sesso, :area
label_apply -> (x, f) {x + " [#{f.size}]"}, :citta

levels_apply

Applica una funzione alle etichette dei valori delle variabili.

Argomenti:

  • funz: la funzione può essere un simbolo o una stringa con il nome della funzione, oppure una lambda (funzione anonima). La lambda ha come primo argomento l’etichetta, come secondo argomento (opzionale) il codice e come terzo argomento (opzionale) l’oggetto Field
  • varlist: il nome della variabile o l’elenco dei nomi delle variabili
1
2
3
4
5
levels_apply :strip_tags, :d1
levels_apply :upcase, :sesso, :area
levels_apply lambda {|x| x.upcase}, :sesso, :area
levels_apply -> (x) {x.upcase}, :sesso, :area
levels_apply -> (x, y) {"#{y}: #{x.upcase}"}, :sesso, :area

zip_code_level

Genera l’hash dei livelli partendo da due variabili, dove la prima variabile contiene i codici, mentre la seconda le etichette corrispondenti.

1
levels :area => zip_code_level(:mcr_code, :mcr_label)

to_c, to_l

  • to_c(level_list): restituisce i codici della variabile corrispondenti alle etichette dei livelli
  • to_l(code_list): restituisce le etichette dei livelli corrispondenti ai codici
1
f(:comune).to_c("MILANO", "Roma", "Reggio di  Calabria")

has_levels?, has_levels!

Controlla se la variabile contiene i livelli indicati. has_levels! interrompe l’esecuzione in caso di errore.
E’ possibile controllare anche solo un sottoinsieme dei livelli.
Il confronto delle etichette avviene senza considerare il maiuscolo/minuscolo e rimuovendo gli spazi iniziali, finali e doppi.

1
2
3
4
has_levels! :v1 => {1=>"Sì", 2=>"No"},
            s(:v2_,1..10) => {1=>"Molto", 2=>"Abbastanza", 3=>"Poco", 4=>"Per nulla", 5=>"Non so"},

has_levels? s(:v2_,1..10) => {1=>"Molto", 2=>"Abbastanza"}

scrap_labels

scrap_labels estrae le etichette delle variabili e dei loro livelli da un file di testo.

Argomenti:

  • filename: il nome del file di testo compresa l’estensione
  • :encoding => string: l’encoding del file (default "UTF-8")
  • :quest => regex: l’espressione regolare per riconoscere il nome/numero della domanda. Deve comprendere due gruppi uno per il nome/numero e uno per l’etichetta (default /^(\d+\w?)\.\s?(.+)$/)
  • :answ => regex: l’espressione regolare per riconoscere gli item di risposta Deve comprendere due gruppi uno per ilcodice e uno per l’etichetta (default /^(\d+)\s+(.+)$/)
  • :pref => string: il prefisso delle variabili nel caso non sia presente nel testo (default "q")
  • :qname => true|false: true inserisce il nome della domanda nell’etichetta (default true)
  • :print => true|false: true stampa la tabella delle etichette nel log (default true)
  • :xlsx => false|"filename": false non produce il file XLSX con le etichette; filename specifica il nome del file XLSX (default genera automaticamente il nome del file)
1
2
3
scrap_labels "screening.txt", :quest => /^(Q\d+\w?)\.?\s+(.+)$/i, :answ => /^()(.+)\t|END$/

scrap_labels "main.txt", :suff => :d

one_to_item_number

In una batteria di variabili, one_to_item_number ricodifica il codice 1 con il codice derivato dal suffisso numerico del nome della variabile. Sposta anche l’etichetta del livello se presente.

Argomenti:

  • varlist: la lista delle variabili
  • :sep => chr: il separatore del numero di item (default "_")
1
one_to_item_number s(:d7_,1..10,99)

item_number_to_one

In una batteria di variabili, item_number_to_one ricodifica il codice derivato dal suffisso numerico del nome della variabile con il codice 1. Sposta anche l’etichetta del livello se presente.

Argomenti:

  • varlist: la lista delle variabili
  • :sep => chr: il separatore del numero di item (default "_")
1
item_number_to_one s(:d7_,1..10,99)