Variabili: generazione e gestione

new o create

Genera nuove variabili.

Argomenti:

  • varname|[varlist]: il nome di una variabile o un elenco di variabili
  • un hash di opzioni:
    • :label => string|[]: l’etichetta della variabile o l’elenco delle etichette delle variabili
    • :levels => []|{}: i livelli della variabile come array di etichette o come hash codice-etichetta
    • :type => :symbol: il tipo di dato della variabile: :integer|:float|:single|:md|:mc|:string|:date|:time|:datetime|:logic|:system|:info. Accetta anche le abbreviazioni: :int|:flt|:sng|:str|:dt|:dtime|:tm|:log|:sys
    • :size => n|n.d: la dimensione della variabile o dimensione.decimali
    • :ndec => n: il numero di decimali
    • :value => val: il valore a cui inizializzare la variabile
    • :missing => []: l’elenco dei valori mancanti
    • :pos => :ini|:end|{:before|:after => :varname}: (opzionale) inserisce la nuova variabile nella posizione indicata
    • :before => :varname: (opzionale) inserisce la nuova variabile prima della variabile indicata
    • :after => :varname: (opzionale) inserisce la nuova variabile dopo la variabile indicata
    • :existing => :error|:ignore|:delete: comportamento in caso di esistenza della variabile:
      • :error (default) genera un errore
      • :ignore ignora l’istruzione (default in new? e create?)
      • :delete cancella la variabile esistente e ridefinisce la variabile (default in new! e create!)
  • alternativamente è possibile indicare nell’ordine: type, size.dec, value, options
  • per le :md, :size è impostato a 1 e :ndec a 0
  • nel caso di set di variabili :md, le eventuali etichette dei livelli vengono attribuite al codice 1 di ciascun item, sequenzialmente, se :levels contiene un array, oppure in base al numero che segue l’ultimo underscore nel nome della variabile, se :levels contiene un hash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# vars, options
new :xeta, :xn7, :x1, :label => ["Età", "N.7", "X.1"]
new :xetacon, :label => "Età puntuale"
new :xsesso, label: "SESSO", levels: {1 => "M", 2 => "F"}
new :xx1, levels: ["A","B","C","D"]
new :xarea, label: "AREA GEOGRAFICA", levels: ["NO", "NE", "C", "S"]
new s(:xx7_,1..10), :levels => ["Sì","No"]
new :xd2, :levels => ["X","Y","Z"]
new :xd3, :levels => {1=>"X", 2=>"Y", 3=>"Z"}
new s(:x,1..9), :value => 1, :existing => :delete

# vars, type, size.dec, value, options
new :v1, :int, 1
new :v2, :int, 1, 9
new :v3, :str, 20, :label => "Etichetta V3"
new :v4, :flt, 4.2, 1.0
new [:v5, :v6, :v7], :flt, "2.10"

# md set
new s(:q1a_,1..5), :md, value: 0, label: "Q1A", levels: ["A", "B", "C", "D", "E"]
new s(:q1b_,1..5,9), :md, value: 0, label: "Q1B", levels: {9=>"Nr", 1=>"A", 2=>"B", 3=>"C", 4=>"D", 5=>"E"}

Nota

Le variabili di tipo :logic, :system e :info hanno un trattamento particolare, per esempio vengono escluse dal riconoscimento dei gruppi multipli e dall’autotab.

new? o create?

Come new e create, ma con :existing =>  :ignore.

new! o create!

Come new e create, ma con :existing => :delete`.

create1

Genera nuove variabili utilizzando la sintassi della vecchia versione di pTabs(1).

int

Genera nuove variabili in formato intero.

Argomenti:

  • il nome di una variabile o un elenco di variabili
  • :value (opzionale) il valore da assegnare alla variabile o nil
  • :label (opzionale) l’etichetta della variabile
  • :levels (opzionale) le etichette dei livelli della variabile cone Array o come Hash

float

Genera nuove variabili in formato float (numero decimale).

Argomenti:

  • il nome di una variabile o un elenco di variabili
  • :value (opzionale) il valore da assegnare alla variabile o nil
  • :size (opzionale) il formato della variabile come #.# (numero_interi.numero_decimli)
  • :label (opzionale) l’etichetta della variabile

string

Genera nuove variabili in formato stringa.

Argomenti:

  • il nome di una variabile o un elenco di variabili
  • :value (opzionale) il valore da assegnare alla variabile o nil
  • :size (opzionale) la dimensione della variabile
  • :label (opzionale) l’etichetta della variabile

copy

Genera una copia di una variabile esistente. Restituisce l’elenco delle variabili create.

Argomenti:

  • elenco variabili esistenti => elenco nuove variabili: le nuove variabili verranno create con i nomi specificati. Se si specifica una sola variabile di origine e più variabili di destinazione, verrà usata la stessa variabile di origine per tutte le variabili di destinazione
  • elenco variabili esistenti: le nuove variabili verranno create con un nome generato automaticamente o come combinazione del nome della variabile di origine con i parametri pref o suff
  • :pref => "string": (opzionale) il prefisso per generare il nome della variabile
  • :suff => "string": (opzionale) il suffisso per generare il nome della variabile
  • :values => true|false: (opzionale) true copia i dati (default), false non copia i dati, ma crea solo le variabili copiando tutti gli altri attributi dalle variabili di origine
  • :if => espressione: (opzionale) copia i dati solo se la condizione specificata è vera
  • :ifnot => espressione: (opzionale) copia i dati solo se la condizione specificata è falsa
  • :pos => :ini|:end|:before|:after: (opzionale) inserisce la nuova variabile nella posizione indicata
  • :force => false|true: (opzionale) se true copia la variabile anche se la variabile di destinazione esiste già (default false)
  • :label => "string": (opzionale) l’etichetta della variabile
  • :levels => []|{}: (opzionale) i livelli della variabile come array di etichette o come hash codice-etichetta
  • :codes => []: i valori della variabile da copiare nella nuova variabile (default tutti)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 copy oldvar => newvar

 copy :d1 => :d1bis, :d2 => :d2bis
 copy [:d1, :d2] => [:d1bis, :d2bis]

 copy :v1 => s(:x1_,1..10), :values => false

 copy [:d2, :d1, :d4, s(:q1_,1..10)], :suff => "_x"

 copy :d2 => :x2, :if => {:d3 => 2}

 copy [:d2, :d1, :d4, s(:q1_,1..10)], :pref => "sud_", :if => {:area => 4}

Dato che copy restituisce i nomi delle variabili create, è possibile utilizzarlo direttamente all’interno di altre istruzioni:

1
2
3
 panel_add :sample, copy([:sesso, :eta, :titolo], :pref => "sud_", :if => {:area => 4})

 panel_add :sample, copy([:sesso, :eta, :titolo], :ifnot => {:area => [1,2]})

rename

Rinomina le variabili. Restituisce l’elenco delle variabili create.

Argomenti:

  • old_varlist => new_varlist: l’elenco delle variabili da rinominare e l’elenco dei corrispondenti nuovi nomi. Il numero degli elementi nei due elenchi deve corrispondere
  • :label => "string": (opzionale) l’etichetta della variabile
  • :levels => []|{}: (opzionale) i livelli della variabile come array di etichette o come hash codice-etichetta
1
2
3
 rename :sesso => :sex
 rename [:sesso, :d1, 'd5.1'] => [:sex, :d100, :d5]
 rename s(:d8_,1..7) => s(:x8_,1..7)
  • varlist => template: l’elenco delle variabili da rinominare e una stringa contenente il carattere # che verrà sostituito con il nome della variabile originaria
1
 rename [:area, :sesso, :eta] => "#_field"  # :area_field, :sesso_field, :eta_field
  • regex => subst: un’espressione regolare e la stringa di sostituzione
1
2
3
 rename /_\d{4}__r\$_/ => ''              # esempio: "jan_2014__r$_" => "jan"
 rename /x(\d{1,2})_(\d{4})/ => 'y\2m\1'  # esempio: "x11_2019" => "y2019m11"
 rename /^(d7_)(.+)$/ => 'old_\1\2'       # esempio: "d7_1", "d7_2", "d7_99" => "old_d7_1", "old_d7_2", "old_d7_99"

rename?

Come rename, ma non genera un errore se la variabile da rinominare non esiste.

rename_re

Rinomina le variabili secondo una o più espressioni regolari.

Argomenti:

  • regex1 => sub1, regex2 => sub2, ...: le coppie di espressione regolare/espressione di sostituzione. Le espressioni regolari verranno applicate nell’ordine dato. Solo la prima che trova una corrispondenza verrà applicata. Nelle espressioni di sostituzione, fare attenzione a usare gli apici singoli ' in presenza dei capturing group (\1, ecc.)
  • :keep => varlist: la lista delle variabili da rinominare (default tutte le variabili)
  • :drop => varlist: eventuali variabili da escludere
  • :error => :none|:warn|:stop: comportamento in caso di variabile non esistente o di conflitto di nome (default :warn)
1
2
rename_re /^(.+?\d)r(\d+)c(\d+)$/ => '\1_\2_\3',   # rinomina per es. d5r2c3 come d5_2_3
          /^(.+?\d)r(\d+)$/ => '\1_\2'             # rinomina per es. q17r5 come q17_5

drop o delete

Cancella le variabili elencate.

keep

Tiene solo le variabili elencate.

drop_empty

Cancella le variabili vuote. Accetta anche un elenco di variabili.

keep_empty

Tiene solo le variabili vuote. Accetta anche un elenco di variabili.

reorder

Riordina le variabili. Con un elenco parziale di variabili, sposta all’inizio le variabili indicate e a seguire le restanti variabili. Senza nessun argomento raggruppa e ordina i gruppi di variabili con la stessa radice. Inserendo come ultimo argomento un numero, inserisce le variabili in quella posizione. -1 inserisce le variabili in fondo alla lista.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
vars = %w(area sesso etaq eta name d7_9 d7_2 d7_1 d7_10 d7_5 d7_6 d7_7 d7_8 d7_3 d5 peso id_comune d7_99 d7_4 ser_no)
spss.open "demo_data20", :keep => vars

reorder
p allvars
# => ["area", "sesso", "etaq", "eta", "name", "d7_1", "d7_2", "d7_3", "d7_4", "d7_5", "d7_6", "d7_7", "d7_8", "d7_9", "d7_10", "d7_99", "d5", "peso", "id_comune", "ser_no"]

reorder :ser_no, :peso, :name
p allvars
# => ["ser_no", "peso", "name", "area", "sesso", "etaq", "eta", "d7_9", "d7_2", "d7_1", "d7_10", "d7_5", "d7_6", "d7_7", "d7_8", "d7_3", "d5", "id_comune", "d7_99", "d7_4"]

reorder :etaq, :eta, 4
p allvars
# => ["ser_no", "peso", "name", "etaq", "eta", "area", "sesso", "d7_9", "d7_2", "d7_1", "d7_10", "d7_5", "d7_6", "d7_7", "d7_8", "d7_3", "d5", "id_comune", "d7_99", "d7_4"]

move

Sposta la variabile nella posizione indicata.

1
move :varname, :ini|:end|{:before|:after => :name}