Selezione delle osservazioni

filter

Seleziona un sottoinsieme di casi in modo temporaneo (può essere modificato o disattivato).

Una nuova istruzione filter sostituisce quella precedente.

Parametri:

  • l’espressione filtro
  • :label definisce un’etichetta che verrà stampata in ogni tavola.
  • :id definisce un identificativo del filtro.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
 # con variabile / valori
 filter :sesso => 1,     :label => "Intervistati di sesso maschile"
 filter :d1 => 1
 filter :not, :d1 => 1
 filter "d1<3"
 filter :d1, :label => "Osservazioni con valori validi sulla D1"
 filter "!d1",      :label => "Osservazioni con valori mancanti sulla D1"
 filter :d1 => [1,2], :d2 => 3..5
 filter "sex=1"
 filter "sex=1 AND etanum>=18", :label => "Intervistati maschi maggiorenni"
 filter "(d1=1 OR d1=3) AND sex=1"
 filter "VALID(reg_uk) AND reg_uk < 99", :label => "Base: UK"
 filter "ANY(_RECNUM_,1,4,9,10)"  # numero riga base 1
 filter "ANY(_NROW_,0,3,8,9)"     # numero riga base 0

filter nil equivale a all:

1
2
3
 filter nil
 filter nil, :label => "Totale campione"
 filter nil, "Totale campione"

Attraverso l’oggetto filter e possibile accedere ai seguenti attributi:

  • filter.caption: l’etichetta
  • filter.expression: l’espressione filtro
  • filter.n: il numero di record filtrati

save_filter!

Il parametro di configurazione save_filter permette di attivare la generazione automatica di una variabile logica per ciascun filtro impostato. La variabile avrà come nome il parametro :id oppure un nome generato automaticamente, come etichetta l’etichetta impostata in :label e come valori 0 e 1, dove 1 indica i casi che soddisfano la condizione del filtro.

filter?

filter? stampa le informazioni relative al filtro.

filtered?

filtered? restituisce true se è impostato un filtro e false se non è impostato.

Attenzione

I filtri vengono calcolati una sola volta quando vengono definiti. Pertanto modificando il valore di una variabile utilizzata nel filtro, non si avrà nessuna modifica dei record selezionati.

Attenzione

Quando viene definito un filtro pTabs memorizza i numeri d’indice dei record filtrati e li utilizza per filtrare le tavole successive. Pertanto quando un filtro è attivo non devono essere usate istruzioni che modificano la struttura del dataset, aggiungendo, togliento o modificando di posizione i record.

Suggerimento

Per le espressioni vedi anche Espressioni

select

Selezione un sottoinsieme di casi in modo definitivo. I record vengono eliminati dal dataset caricato in memoria (non dal file su disco).

Utilizza la stessa sintassi di filter. [1]

reject

Elimina i casi dal dataset in base ai valori indicati di una variabile o al numero di riga.

Parametri:

  • :varname, valuelist: il nome della variabile seguito dall’elenco dei valori
  • oppure, :rownumbers: l’elenco dei numeri di riga
1
2
3
4
5
 reject :ser_no, 10..50, 56

 reject :id, '001056', '023109', '075129'

 reject 24, 25, 30

hold

Tiene solo i casi del dataset che hanno i valori indicati di una variabile o i numeri di riga specificati.

Parametri:

  • :varname, valuelist: il nome della variabile seguito dall’elenco dei valori
  • oppure, :rownumbers: l’elenco dei numeri di riga
1
2
3
4
5
 hold :ser_no, 10..50, 56

 hold :id, '001056', '023109', '075129'

 hold 24, 25, 30

all

Se è stato selezionato un sottoinsieme di casi con il comando filter [2], all elimina il filtro riattivando tutti i record. E’ possibile utilizzare i parametri :id e :label come in filter. L’etichetta può anche essere specifata come primo argomento senza la chiave :label. E’ possibile anche utilizzare filter nil.

1
2
3
 all
 all "Base: totale intervistati", :id => "tutti"
 all :label => "Base: totale intervistati", :id => "tutti"

cases

cases modifica i parametri :id e/o :label della selezione corrente (anche per il totale casi), senza modificare la selezione dei casi. L’etichetta può anche essere specificata come primo argomento senza la chiave :label. Può essere utilizzato anche se non è stato utilizzato nessuno dei comandi filter, select e all.

1
2
3
 cases "BASE: totale casi"
 cases :label => "BASE: totale casi"
 cases :id => :male, :label => "BASE: maschi"

Suggerimento

Se si vuole semplicemente modificare l’etichetta stampata nelle tavole, utilizzare cases non all.

break

break esegue il codice contenuto nel blocco impostando un nuovo filtro a ogni ripetizione. Eventuali filtri attivi e/o etichette della selezione dei casi vengono eliminati. Al temine, break lascia il dataset impostato senza filtri ed etichette di selezione dei casi.

break passa nel blocco quattro argomenti: l’etichetta, l’indice (con base 1), l’espressione filtro generata, il numero di casi selezionato e, se disponibili, i codici della variabile.

break può essere eseguito come metodo di una variabile (indicata come stringa o come simbolo). A ogni iterazione i dati saranno filtrati rispetto a ciascun livello della variabile:

1
2
3
4
:area.break do |lab, i, exp, n, code|
  cat :d1
  ord :d5
end

break può essere eseguito come metodo di un array di nomi di variabili multidicotomy. A ogni iterazione i dati saranno filtrati rispetto al valore true di ciascuna variabile:

1
2
3
4
s(:d7_,1..10,99).break do |lab, i, exp, n, code|
  cat :d1
  ord :d5
end

break può essere eseguito come metodo di un Hash in cui viene indicato esplicitamente l’etichetta del filtro (le chiavi dell’hash) e l’espressione filtro (i valori dell’hash):

1
2
3
4
5
6
7
{ "NORD"         => {:area => [1,2]},
  "CENTRO"       => {:area => 3},
  "SUD - MASCHI" => "area=4 AND sesso=1",
  "SUD - DONNE"  => "area=4 AND sesso=2"  }.break do |label, index, exp, n, code|
  scale s(:d6_,10)
  md s(:d7_,10)
end

break accetta i seguenti argomenti:

  • :total => "label": esegue il blocco di istruzioni anche senza filtro (“a totale”) usando come etichetta la stringa indicata
  • :nmin => n: esegue il blocco di istruzioni solo se il numero di record selezionati è maggiore o uguale a n (l’eventuale blocco definito da :total viene eseguito comunque)
  • :nmax => n: esegue il blocco di istruzioni solo se il numero di record selezionati è minore o uguale a n (l’eventuale blocco definito da :total viene eseguito comunque)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
'sesso'.break(total: "Totale casi") do
  cat :d1
end

{...}.break(total: "TOTALE") do ...

:sesso.break(total: "", :nmin => 30) do |label, i, exp, n, code|
  filter "area=1 AND #{exp}", :label => "Nord Ovest: #{label}"
  cat :d1
end

E’ possibile generare le tavole a totale in modo esplicito:

1
2
{ "TOTALE"   => :area,
  "NORD"     => {:area => [1,2]}, ... }.break ...

Consiglio

Per realizzare blocchi ripetuti di tavole e/o di altre istruzioni, vedere anche il metodo rep nella sezione Funzioni di utilità.

each_levels

Il metodo each_levels applicato al nome di una variabile, esegue un blocco di istruzioni per ciascun livello della variabile. each_levels passa nel blocco tre argomenti: il codice, l’etichetta e l’indice a base 1.

Attenzione

each_levels non filtra i casi del dataset attivo.

1
2
3
4
:sesso.each_levels do |code, lbl|
  filter :sesso => code, :label => lbl
  cat :d1
end

Note

[1]Quando la selezione dei casi riguarda tutto il report (o tutta la parte restante), benché il risultato sia identico, select è da preferire a filter in quanto, eliminando le osservazioni, riduce i tempi di elaborazione. I dati non vengono eliminati dal file di dati, ma solo dal data frame in memoria.
[2]all non ha efficacia se è stato precedentemente utilizzato select.