Funzioni informative

Le funzioni seguenti restituiscono informazioni relative alle variabili e ai dati presenti nel dataset. Sono utili per titoli e note o per condizionare il comportamento e rendere più flessibile lo script di pTabs.

Variabili

exist?

Controlla se le variabili esistono nel dataframe corrente e restituisce true se tutte le variabili esistono e false se almeno una variabile non esiste.

1
2
3
 cat :v10045 if exist?(:v10045)
 ord [:eta, etaq] if exist?(:eta, etaq)
 md s(:v100,10) if exist?(s(:v100,10))

existing

Controlla se le variabili esistono nel dataframe corrente e restituisce l’elenco (Array) delle solo variabili esistenti.

1
2
 cat existing(:v1,:v2,:v3)
 md existing(s(:d7_,99))

varnames

varnames(varlist) restituisce un vettore di nomi di variabili partendo dall’elenco di variabili dato ed espandendo gli eventuali net.

size

size(varlist) restituisce il numero di elementi partendo dall’elenco di variabili dato ed espandendo gli eventuali net.

usedvars

usedvars restituisce un vettore con i nomi di tutte le variabili utilizzate nelle tavole (pannelli e fiancate).

1
2
 # esporta un file contenente solo le variabili utilizzate nella tabulazione
 excelx.save "variabili_usate", :vars => usedvars, :as_num => false

allvars

allvars restituisce un vettore con i nomi di tutte le variabili presenti nel file di dati.

Il parametro :sets => true restituisce i set di variabili, dove presenti, al posto delle singole variabili.

1
2
# esporta un file contenente solo le variabili NON utilizzate nella tabulazione
excelx.save "variabili_non_usate", :vars => allvars-usedvars, :as_num => false

Etichette e livelli

factor?

factor?(varname) restituisce true se la variabile è una variabile factor, altrimenti restituisce false.

get_label

get_label(varname) restituisce la stringa con l’etichetta della variabile.

get_labels

get_labels(varlist) restituisce un vettore con le etichette delle variabili.

1
2
3
 get_labels(s(:d7,10)).rep do |label|
   ...
 end

get_levels

get_levels(varname) restituisce un vettore con le etichette dei livelli della variabile.

1
2
3
4
 get_levels(:d1).rep do |label, index|
   filter :d1 => index, :label => label
   ord :d5
 end

get_codes_and_levels

get_codes_and_levels(varname) restituisce un hash con i codici e le etichette dei livelli della variabile.

1
2
3
4
5
get_codes_and_levels(:area).each do |code, lab|
  filter :area => code, :label => "Area: "+lab
  cat :d1
  ord :d5
end

get_values

get_values(varname) restituisce un array con i valori presenti nella variabile. I valori sono restituiti come valori decimali.

1
2
p get_values(:eta)
[1.0, 2.0, 3.0, 4.0]

get_max_level

get_max_level(varname) restituisce il numero totale dei livelli della variabile. Equivale a get_max_level(varname).size.

info

info(varname) restituisce un oggetto PTables::VariableInfo contenente varie informazioni relative alla variabile o al set di variabili.

Metodi dell’oggetto VariableInfo:

  • name: restituisce il nome della variabile
  • set?: restituisce true se la variabile è un set di variabili
  • type: restituisce il tipo di variabile: :numeric, :factor, :alpha
  • numeric?: restituisce true se la variabile è numerica
  • factor?: restituisce true se la variabile è factor
  • alpha?: restituisce true se la variabile è alfanumerica
  • multi?: restituisce true se la variabile è multipla
  • label: restituisce l’eticheta della variabile
  • levels: se la variabile è una factor restituisce le etichette dei valori
  • values: restituisce i valori della variabile
  • range: se la variabile è numerica restituisce il range dei valori
  • print: stampa le informazioni nell’output
1
2
3
4
i5 = info(:d5)
md i5 if i5.multi?

info(m7).print

df?

df? o show_dataframe stampa nell’output la struttura del data frame.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
df?

'data.frame':        300 obs. of  14 variables:
 $ ser_no       : int  1 2 3 4 5 6 7 8 9 10 ...
 $ area         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ sesso        : int  1 2 1 2 2 2 2 2 2 1 ...
 $ eta          : int  3 2 4 3 3 4 3 2 2 4 ...
 $ titolo       : int  3 3 4 4 3 2 3 3 4 3 ...
 $ prof         : int  3 1 1 4 2 4 1 2 1 1 ...
 $ dc           : int  4 4 2 2 2 2 6 4 4 1 ...
 $ d1           : int  3 4 4 2 2 4 4 4 3 4 ...
 $ d2           : int  1 3 3 1 1 3 3 1 1 1 ...
 $ d5           : int  NA NA NA NA NA NA NA NA NA NA ...
 $ w1           : Factor w/ 4 levels " ,25","1,00",..: 3 4 4 2 2 4 4 4 3 4 ...
 $ let          : Factor w/ 2 levels "A","B": 1 2 1 2 1 2 1 2 1 2 ...
 $ ._tot        : Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1 ...
 $ ._fake.weight: num  1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "variable.labels")= Named chr  "ser_no" "area" "sesso" "eta" ...
  ..- attr(*, "names")= chr  "" "" "" "" ...
 - attr(*, "value.labels")= list()

Dati

list

list stampa nell’output i valori delle variabili dei record del data frame.

  • vars: elenco variabili
  • rows: numero di riga o intervallo di righe (ignorato se specificato :if)
  • if: filtro per selezionare un sottoinsieme di casi (Espressioni)
  • numeric: (false|true) converte i valori delle variabili in valori numerici (default false)
1
 list :vars => [:ser_no, :sesso, :eta, :etaq, :area, s(:d7_,4)], :rows => 1..10
   ser_no   sesso        eta etaq       area d7_1 d7_2 d7_3 d7_4
1       1 Maschio 25-30 anni   25 Nord Ovest    1    1    1    0
2       2 Femmina 18-24 anni   24 Nord Ovest    0    0    1    0
3       3 Maschio 31-34 anni   31 Nord Ovest    1    0    0    1
4       4 Femmina 25-30 anni   25 Nord Ovest    1    1    0    0
5       5 Femmina 25-30 anni   30 Nord Ovest    1    1    1    0
6       6 Femmina 31-34 anni   33 Nord Ovest    1    0    0    0
7       7 Femmina 25-30 anni   30 Nord Ovest    1    1    1    1
8       8 Femmina 18-24 anni   20 Nord Ovest    0    0    1    1
9       9 Femmina 18-24 anni   24 Nord Ovest    1    0    1    0
10     10 Maschio 31-34 anni   32 Nord Ovest    1    1    0    0
1
 list :vars => [:ser_no, :sesso, :etaq, :d1], :if => "#sesso==1 & etaq>=33", :numeric => true
    ser_no sesso etaq d1
15       5     1   34  1
37      37     1   34  3
114    117     1   34  4
122    125     1   33  4
138    141     1   34  4
192    195     1   33  3
226    229     1   34  4
240    243     1   33  4
257    260     1   33  4
279    282     1   34  3
281    284     1   33  4
296    299     1   33  3
299    302     1   34  4
300    303     1   33  3

get_base

get_base(varname, value) restituisce il numero di casi pesati di una variabile o di un suo livello (se specificato value).

Se non si specifica varname verà restituito il numero totale di casi pesati del dataframe.

1
2
3
4
5
6
 base_d5 = get_base(:d5)
 if base_d5 > 100
   ord :d5
 end

 ord :d1 if get_base(:d1, 2) > 30

get_base_u

get_base_u(varname, value) restituisce il numero di casi non pesati di una variabile o di un suo livello (se specificato value).

Se non si specifica varname verà restituito il numero totale di casi non pesati del dataframe.

get_counts

get_counts(varname [, :drop]) restituisce i livelli di una variabile con le distribuzioni di frequenza ponderate (se è attiva una variabile di ponderazione). Il parametro :drop elimina i livelli con frequenze pari a zero. get_counts restituisce un vettore con un elemento per ciascun livello della variabile costituito a sua volta da un vettore di tre elementi: codice livello, etichetta livello, conteggio frequenze:

p get_counts(:sesso)
[[1, "Maschio", 154.0], [2, "Femmina", 146.0]]
1
2
3
4
 get_counts(:d1, :drop).each do |code, lab, count|
   filter :d1 => code, :label => "D1: #{lab} (n.#{count.round})"
   ord :d5
 end

get_counts_u

get_counts(varname [, :drop]) funziona in modo analogo a get_counts, ma restituisce sempre le distribuzioni di frequenza non ponderate.

xtab

xtab(varname[, by: varname]) calcola una tabella con le distribuzioni di frequenza di una variabile (variabile di riga). Specificando un’ulteriore variabile con il parametro by (variabile di colonna) calcola una tabella di contingenza.

Importante

Se è attiva una variabile di ponderazione, xtab calcola i dati ponderati. Per produrre dati non ponderati usare xtab_u.

Se è attivo un filtro, xtab restituisce i dati filtrati, cioè solo per i casi attivi.

Opzioni:

  • by: specifica un nome di variabile da incrociare
  • drop: elimina i livelli/valori con frequenze pari a zero (default: false)
  • decimal: numero di decimali delle percentuali (default: valore impostato nel parametro di configurazione :frm_pct)
  • count_dec: numero di decimali dei valori assoluti (default: valore impostato nel parametro di configurazione :frm_count)
  • if: filtro per selezionare un sottoinsieme di casi (Espressioni)

xtab restituisce un oggetto che dispone di vari metodi per estrarre i dati.

Metodo Tipo dato restituito Descrizione
nrows Integer Numero righe tabella
ncols Integer Numero colonne tabella
size Array Dimensioni tabella (righe, colonne)
codes Array Valori/codici variabile
label String Etichetta variabile riga
labels Array Etichette delle modalità della variabile di riga
clabel String Etichetta variabile colonna
clabels Array Etichetta delle modalità della variabile di colonna
data (col=nil, simplify=true) Array Array con le serie di dati della tabella (una serie per il totale e una per ciascuna modalità della variabile di colonna)
counts (col=nil) Array Valori assoluti
pcts (col=nil) Array Percentuali di colonna
tcounts (simplify=true) Array Totali colonne
tpcts (simplify=true) Array Percentuale dei totali delle colonne
print Object Stampa nell’output una versione testuale della tabella (restituisce lo stesso oggetto)

I metodi data, counts e pcts accettano come argomento il numero di colonna dei dati da estrarre (0 è la colonna del totale) o l’etichetta della colonna. I vettori di dati restituiti potranno quindi essere costituiti da una o più serie di dati.

1
2
3
4
5
6
7
8
9
 x = xtab(:d1, by: :sesso).print
 p x.counts
 # [[27, 43, 56, 170, 4], [12, 25, 32, 84, 0], [15, 17, 23, 81, 4]]
 p x.counts(1)
 # [12, 25, 32, 84, 0]
 p x.pcts
 # [[9.0, 14.3, 18.7, 56.7, 1.3], [7.8, 16.3, 20.9, 54.9, 0], [10.7, 12.1, 16.4, 57.9, 2.9]]
 p x.pcts('maschio')
 # [7.8, 16.3, 20.9, 54.9, 0]

I dati sono semplificati in modo da restituire il tipo più semplice di dato. Utilizzare false per non semplificare i dati.

1
2
3
4
5
6
7
8
  p xtab(:d1, by: :sesso).tcounts
  # <Array> [300, 153, 140]

  p xtab(:d1).tcounts
  # <Fixnum> 300

  p xtab(:d1).tcounts(false)
  # <Array> [300]

Il metodo data restituisce un array per ciascuna serie di dati contenente un array costituito da una struttura con quattro campi per ciascuna riga: code, label, count, pct:

1
2
3
4
 x = xtab(:sesso)
 p x.data
 # [#<struct PTables::Counts::Row code=1, label="Maschio", count=153, pct=52.2>,
 #  #<struct PTables::Counts::Row code=2, label="Femmina", count=140, pct=47.8>]

Esempi utilizzo:

  • ripetizione sui valori di una variabile con controllo della numerosità e indicazione della numerosità nell’etichetta del filtro:

    1
    2
    3
    4
    5
     xtab(:d1).data.each do |x|
       next if x.count < 50
       filter :d1 => x.code, :label => "D1: #{x.label} (n.#{x.count})"
       ord :d5, "D5.#{x.code}"
     end
    

print:

1
 xtab(:d1, by: :sesso).print
Con quale frequenza frequenza di solito vai...?
by Sesso
+-------+---------------------------------------+--------+-------+---------+------+---------+------+
| Value |                   Label               | TOTALE |   %   | Maschio |  %   | Femmina |  %   |
+-------+---------------------------------------+--------+-------+---------+------+---------+------+
|     1 | una volta alla settimana o più spesso |     27 |   9.0 |      12 |  7.8 |      15 | 10.7 |
|     2 | una volta ogni due settimane          |     43 |  14.3 |      25 | 16.3 |      17 | 12.1 |
|     3 | una volta ogni tre settimane          |     56 |  18.7 |      32 | 20.9 |      23 | 16.4 |
|     4 | una volta al mese                     |    170 |  56.7 |      84 | 54.9 |      81 | 57.9 |
|     5 | meno spesso                           |      4 |   1.3 |       0 |    0 |       4 |  2.9 |
|       | Totale                                |    300 | 100.0 |     153 | 51.0 |     140 | 46.7 |
+-------+---------------------------------------+--------+-------+---------+------+---------+------+

xtab_u

xtab_u(varname[, by: varname]) funziona in modo analogo a xtab, ma usa dati non ponderati.

get_data

get_data(varlist, options={}) restituisce dei vettori con i dati delle variabili indicate.

Opzioni:

  • as_num: converte i dati in numerici (default false)
  • jitter: aggiunge “rumore” ai dati numerici (true oppure un valore, default false)
  • if: filtro per selezionare un sottoinsieme di casi (Espressioni)

get_last_id

get_last_id restituisce l’id dell’ultima tabella generata.

valid?

valid?(varname) restituisce true se la variabile contiene casi validi, altrimenti restituisce false.

missing?

missing?(varname) restituisce true se la variabile contiene solo casi mancanti, altrimenti restituisce false.

get_selection

get_selection(expression) restituisce il numero di casi pesati selezionati dall’espressione.

Vedi anche Espressioni e parse

get_selection_u

get_selection_u(expression) restituisce il numero di casi non pesati selezionati dall’espressione.

Vedi anche Espressioni e parse

Data e ora

L’oggetto time contiene la data e l’ora corrente. E’ possibile estrarre alcuni dati applicando vari metodi:

  • year: anno
  • month: numero del mese
  • day: numero del giorno del mese
  • wday: numero del giorno della setitmana
  • yday: numero del giorno dell’anno
  • today(format): stringa con la data corrente; formato di default: %Y%m%d
  • now(format): stringa con la data e l’ora corrente; formato di default: %Y%m%d%H%M%S
  • days: vettore con il nome dei giorni della settimana in inglese
  • giorni: vettore con il nome dei giorni della settimana in italiano
  • months: vettore con il nome dei mesi in inglese
  • mesi: vettore con il nome dei mesi in italiano
  • freeze!: blocca la data e l’ora anche per le successive richieste all’oggetto time
1
2
3
4
5
6
 # se è il 31/12/2012 23:59:59
 spss.open "data_#{time.year}"                                         # => data_2012
 spss.open "data_#{time.today}"                                        # => data_20121231
 spss.open "data_#{time.now}"                                          # => data_20121231235959
 spss.open "data_#{time.year}_" + time.mesi[time.wday][0..2]           # => data_2012_dic
 spss.open "data" + time.year.to_s + time.mesi[time.wday][0..2].upcase # => data2012DIC

Funzioni per i titoli delle tabelle

$vl()

$vl(varname) [1] inserisce nel titolo della tabella l’etichetta della variabile. L’argomento varname è facoltativo, se omesso viene considerata la prima variabile della tabella. Altrimenti si può utilizzare qualsiasi nome di variabile esistente nel file di dati, anche se non fa parte della tabella. Il nome deve essere inserito senza virgolette. Le parentesi vanno comunque inserite.

Le varianti $VL(), $Vl() mettono l’etichetta rispettivamente in maiuscolo e con la prima lettera maiuscola.

1
2
3
 cat :d12_1, "Esprima un giuduzio relativamente ai seguenti personaggi;\n$vl()"

 ord [:aggr12_1, :d12_1], "Esprima un giuduzio relativamente ai seguenti personaggi;\n$VL(d12_1)"

$vn()

$vn(start) inserisce nel titolo della tabella il nome della variabile. Le varianti $VN(), $Vn() mettono il nome rispettivamente in maiuscolo e con la prima lettera maiuscola. Se sono presenti più variabili nella tabella, cercherà di inserire la radice comune. start è facoltativo e indica il numero di carattere del nome da cui partire. Il comando è utile per i parametri :title_template e :title_prefix.

1
 title_template "Tab.$tn() - $VN() - $vl()"

$tn()

$tn(offset) inserisce nel titolo della tabella il numero progressivo della tavola. offset è facoltativo e deve essere un numero positivo o negativo che verrà sommato al numero della tavola. Il comando è anche utile per i parametri :title_template e :title_prefix.

1
 title_prefix "Tabella $tn(-1) : "

Note

[1]$vl() sostituisce $var_label() che viene comunque ancora accettato.