Operazioni sui data frame

Workspaces

E’ possibile caricare più di un file di dati, allo scopo, per esempio, di alternare la fonte di dati delle tavole, oppure per unire due file. In tali casi, i dati devono essere caricati in un’area di lavoro differente, utilizzando il parametro :workspace => # o :ws => #, dove # è un numero superiore a 1. Il data frame aggiuntivo si chiamerà dfr#. Non utilizzando il parametro :workspace la nuova matrice di dati prenderebbe il posto del data frame precedente. Il workspace di default è 1 corrispondente al data frame dfr.

1
2
3
 spss.open "dati"                            # carica i dati in dfr
 spss.open "altri_dati", :workspace => 2     # carica i dati in dfr2
 r.open "altri_dati", :ws => 3               # carica i dati in dfr3

L’istruzione workspace # o ws # attiva un data frame differente e lo rende disponibile per la tabulazione. Il nome del data frame attivo è comunque sempre dfr.

1
2
3
4
5
6
7
8
9
 cat :d1                                     # tavola sul data frame 1

 workspace 2                                 # attiva il data frame 2 rendendolo disponibile come dfr
 r << "dfr$espcam <- dfr$peso * 1.327"       # istruzione R che agisce sul data frame attivo (dfr)
 weight! :espcam
 cat :x1                                     # tavola sul data frame 2

 ws 1                                        # riattiva il data frame 1
 cat :d5                                     # tavola sul data frame 1

Merge

merge unisce le variabili di due data frame precedentemente caricati nelle rispettive aree di lavoro (workspace).

Parametri:

  • :x: primo data frame; default: dfr
  • :y: secondo data frame; default: dfr2
  • :z: data frame destinazione; default: primo data frame
  • :by_x: chiave di unione primo data frame; default: prima colonna
  • :by_y: chiave di unione secondo data frame; default: prima colonna
  • :all_x: tiene tutte le righe di x; default: true
  • :all_y: tiene tutte le righe di y; default: false
  • :sort: ordina data frame risultante sulla chiave; default: true

merge senza alcun parametro unisce in secondo data frame (dfr2) al primo (dfr) usando la prima colonna come chiave e tenendo tutti i casi del primo data frame (dfr).

I dati dei due data frame non devono essere precedentemente ordinati.

Il tipo di dato/formato delle chiavi può essere diverso: per esempio interi in un data frame e caratteri nell’altro. I dati verranno confrontati convertendo il dato più specifico verso quello più generico (in questo caso gli interi vengono convertiti in stringhe 123 => "123"), pertanto 123 corrisponderà a "123", ma non a "123.00" o a "  123".

Attenzione, in caso di presenza di variabili con lo stesso nome, verranno aggiunti i suffissi .x e .y ai nomi delle variabili.

1
2
3
 spss.open "dati"                            # => dfr
 spss.open "comuni", :workspace => 2         # => dfr2
 merge :by_x => :id_comune, :by_y => :id

Union

union unisce i casi di due data frame precedentemente caricati nelle rispettive aree di lavoro (workspace).

Parametri:

  • :x: primo data frame; default: dfr
  • :y: secondo data frame; default: dfr2
  • :z: data frame destinazione; default: primo data frame

union senza alcun parametro unisce il secondo data frame (dfr2) al primo (dfr).

1
2
3
 spss.open "maschi"                           # => dfr
 spss.open "femmine", :workspace => 2         # => dfr2
 union

Aggregate

aggregate genera un nuovo data frame applicando le funzioni specificate alle variabili dei record che hanno la stessa chiave.

Parametri:

  • :key: un nome di variabile o un array con un elenco di variabili che costituiscono la chiave su cui aggregare i dati
  • :keep: un array con un elenco di variabili che devono essere riportate come sono nei nuovi record: il loro valore viene assunto come costante rispetto alla chiave di aggregazione
  • :vars: un hash con le nuove variabili da calcolare durante l’aggregazione
  • :workspace o :ws (opzionale): il workspace di destinazione. Se omesso, utilizza il workspace successivo rispetto a quello attivo

Funzioni di aggregazione

Funzioni che agiscono su una sola variabile. Possono essere applicate una variabile per volta: :newvarname => {:funzione => :varname}, oppure su un elenco di variabili: [newvarlist] => {:funzione => [varlist]}. Il numero delle variabili generate deve essere uguale al numero di variabili di partenza:

  • :count: senza argomenti conteggia il numero di record che vengono aggregati. Con il nome di una variabile, conteggia il numero di record con un valore valido rispetto alla variabile
  • :avg: la media dei valori validi di una variabile
  • :min: il valore minimo di una variabile
  • :max: il valore massimo di una variabile
  • :sum: la somma dei valori di una variabile

Alle funzioni è possibile aggiungere il suffisso _distinct: il risultato verrà calcolato escudendo i record con valori duplicati.

Funzioni che agiscono su un elenco di variabili; hanno la forma: :newvarname => {:funzione => [varlist]}. Viene generata una sola variabile a partire da un elenco di più variabili. L’operazione di aggregazione viene fatta in due diversi passi: prima si effettua un calcolo su ogni record del data frame e poi si aggrega il risultato:

  • :vcount: conteggia il numero di valori validi in un set di variabili e poi somma il valore ottenuto per ciascun record
  • :vavg: calcola la media dei valori validi di un set di variabili e poi calcola la media del valore ottenuto tra i record
  • :vmin: calcola il valore minimo di un set di variabili e poi calcola il valore minimo tra i record
  • :vmax: calcola il valore massimo di un set di variabili e poi calcola il valore massimo tra i record
  • :vsum: calcola la somma dei valori di un set di variabili e poi calcola la somma dei valori tra i record
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
aggregate :key => :id_fam,
          :keep => [:mcr, :ampc, :regio],
          :vars => {
            :nrecords => :count,
            :nvalue_d5 => {:count_distinct => :d5},
            :totwgt => {:sum => :peso},
            :meanwgt => {:avg => :peso},
            s(:q6_,10) => {:max => s(:d6_,10)},
            s(:d7_,10) => {:sum => s(:d7_,10)},
            :nlinee => {:vcount => s(:linea_,5)}
            :toteuro => {:vsum => s(:linea_,5)},
          },
          :ws => 2

Attenzione

Tutte le variabili utilizzate nel comando aggregate non devono contenere il punto nel nome.

Stack

stack genera un nuovo data frame concatenando differenti set di variabili di un data frame in singole variabili.

Converte un data frame dal formato wide al formato long.

Parametri:

  • :keep: una stringa o simbolo oppure un array con le variabili che devono essere riportate come sono nei nuovi record
  • :vars: un hash con i set di variabili che devono essere concatenati. Le chiavi dell’hash sono i nomi delle nuove variabili, mentre i valori sono gli elenchi delle variabili. Il tipo di variabile (numerica o factor) viene mantenuto
  • :group (opzionale): il nome della variabili che distingue i gruppi di record. Puo essere: una stringa o un simbolo, oppure un hash dove la chiave è il nome della variabile mentre i valori sono i valori da attribuire ai diversi gruppi. Se i valori sono stringhe (etichette) verrà generata una variabile factor.
  • :workspace o :ws (opzionale): il workspace di destinazione. Se omesso, utilizza il workspace successivo rispetto a quello attivo
1
2
3
4
5
6
stack :keep => :peso, :vars => {:d1 => s(:v1_,10)}

stack :keep => [:ser_no, :area, :sesso, :eta, :peso],
      :vars => {:d6 => s(:d6_,6), :d7 => s(:d7_,6)},
      :group => {:bimestre => ["Bimestri 2013", ["Gen-Feb", "Mar-Apr", "Mag-Giu", "Lug-Ago", "Set-Ott", "Nov-Dic"]]},
      :ws => 3

Possibili forme di :group:

1
2
3
4
5
     :group => :x
     :group => {:x => "VarLabel"}
     :group => {:x => ["A", "B", "C", "D"]}
     :group => {:x => ["VarLabel", ["A", "B", "C", "D"]]}
     :group => {:x => 101..106}

Attenzione

Tutte le variabili utilizzate nel comando aggregate non devono contenere il punto nel nome.

Unstack

unstack genera un nuovo data frame contenente un solo record per ogni valore della chiave e affiancando gruppi ripetuti di variabili.

Converte un data frame dal formato long al formato wide.

Parametri:

  • :key: un nome di variabile o un array con un elenco di variabili che identifica i record del nuovo data frame
  • :keep: un array con un elenco di variabili che devono essere riportate come sono nei nuovi record: il loro valore viene assunto come costante rispetto alla chiave
  • :group: il nome della variabile che identifica i gruppi da ripetere nel caso si voglia generare tutti i gruppi presenti nel file di dati oppure un hash con il nome della variabile e l’elenco dei valori dei gruppi da generare nel caso si intenda indicare gruppi in difetto o in eccesso rispetto a quelli effettivamente presenti nei dati
  • :vars: le variabili da ripetere per ciascun gruppo
  • :workspace o :ws (opzionale): il workspace di destinazione. Se omesso, utilizza il workspace successivo rispetto a quello attivo
1
2
3
4
5
unstack :key => :ser_no,
        :keep => [:area, :sesso, :eta, :peso],
        :group => :bimestre,
        :vars => [:v1, :v4, :v6, :v7],
        :ws => 2

Per assicurarsi di generare le variabili per tutti i bimestri anche se non sono presenti nei dati:

1
        :group => {:bimestre => 1..6}

Attenzione

Tutte le variabili utilizzate nel comando aggregate non devono contenere il punto nel nome.

Esempio stack e unstack

Un data frame contiene il test di nove varianti di prodotto. Ogni intervistato testa solo tre varianti. Le risposte sono memorizate in tre set di variabili. Le variabili v1_1, v1_2 e v1_3 contengono l’identificatativo della variante testata.

Con stack si genera un data frame che contiene un solo set di variabili, ma tre record per ogni intervistato. Tale struttura è adatta per realizzare tavole con in pannello i diversi prodotti.

In seguito, con unstack si genera un data frame che contiene un solo record per intervistato e nove set di variabili, per ciascuna delle varianti di prodotto.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
stack :keep => [:ser_no, :sesso, :eta, :peso],
      :vars => {
        :variante => s(:v1_,3),
        :v2 => s(:v2_,3),
        :v3 => s(:v3_,3),
        :v4 => s(:v4_,3),
        s(:v5_,9) => ss("v5_#2_#1",9,3)
      },
      :group => {:test => ["Prodotti testati", ["Test 1", "Test 2", "Test 3"]]},
      :ws => 2

ws 2

panels.add :_t, :variante
cat :v2
cat :v3
cat :v4
md s(:v5_,9)

unstack :key => :ser_no,
        :keep => [:sesso, :eta, :peso],
        :vars => [:v1, :v2, :v3, :v4, s(:v5_,9)],
        :group => {:variante => 1..9},
        :ws => 3