Manual de R (Estadística)/Modificar les dades

Les taules de dades

modifica

Una taula de dades (data frame en anglès) és un tipus fitxer on se solen emmagatzemar les dades que s'han d'analitzar [1]. Està compost d'una sèrie de columnes amb un mateix nombre de files. Per exemple, la taula de dades DADES hi ha les dades del sexe i edat de 8 persones (l'edat d'una d'elles és desconeguda):

 
> DADES = data.frame(SEXE=c("Dona", "Home", "Home", "Dona", "Dona", "Dona", "Home", "Home"),
+                    EDAT=c(20,NA,30,24,25,21,32,35))                                       # Dades de 8 persones
> DADES                                                                                     # Visualitzar les dades
  SEXE EDAT
1 Dona   20
2 Home   NA
3 Home   30
4 Dona   24
5 Dona   25
6 Dona   21
7 Home   32
8 Home   35

La línia primera del llistat de les dades s'anomena capçalera i conté els noms de les variables (columnes). Cada línia sota la capçalera, és una fila de dades o registre, que comença amb el nom de la fila (el nombre de 1 a 8, però podria ser un nom), i continua amb les dades reals de sexe i d'edat. Cada element d'una fila s'anomena cel·la.

En les dades anteriors, el nom dels registres és un nombre. Però podria ser un nom, com en la taula de dades mtcars (datasets) que s'instal·la per omissió en instal·lar el R:

 
> mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
 [... files esborrades ...]
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

En aquest cas, el nom del registre és la marca i model del cotxer de les dades de la fila. Si es volen conèixer més detalls d'aquestes dades, es pot executar l'ordre help(mtcars).

Inspeccionar les dades

modifica

Abans de treballar en les dades, és convenient visualitzar-les per inspeccionar-les. Si les dades s'han importat d'altres programes o de fitxers plans, cal inspeccionar-les per verificar que la importació s'ha realitzat correctament. En tot cas, es tracta de familiaritzar-se amb l'estructura de l'arxiu on estan les dades, p. ex., quines variables conté i com estan codificades.

Inspeccionar les taules de dades

modifica

El primer pas és determinar si el nombre de registres (files) i de variables (columnes) de la taula de dades és el que s'espera. Per a determinar quants registres (nombre de files) té la taula, es pot cridar la funció nRow():

> # Dades de 8 persones:
> DADES = data.frame(SEXE=c("Dona", "Home", "Home", "Dona", "Dona", "Dona", "Home", "Home"),
+                    EDAT=c(20,NA,30,24,25,21,32,35)) 
> DADES                          
  SEXE EDAT
1 Dona   20
2 Home   NA
3 Home   30
4 Dona   24
5 Dona   25
6 Dona   21
7 Home   32
8 Home   35

> nrow(DADES)                                # Visualitzar el nombre de registres (files)
[1] 8

Igualment, per saber el nombre de variables (nombre de columnes) es pot cridar la funció nCol():

 
> ncol(DADES)                                # Visualitzar el nombre de variables
[1] 2

La funció names() torna els noms de les columnes de la nostra taula, és a dir, els noms de les variables:

 
> names(DADES)
[1] "SEXE" "EDAT"

La funció str(<taula de dades>) proporciona una informació més completa. Llista les diferents variables indicant el tipus de les mateixes i en mostra els primers valors de cada una. Per exemple, per visualitzar l'estructura del fitxer Aids2 del paquet MASS:

> data(Aids2, package="MASS")                 # És carregen les dades
> str(Aids2)                                  # Mostra l'estructura del fitxer 
'data.frame':	2843 obs. of  7 variables:
 $ state  : Factor w/ 4 levels "NSW","Other",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ sex    : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ...
 $ diag   : int  10905 11029 9551 9577 10015 9971 10746 10042 10464 10439 ...
 $ death  : int  11081 11096 9983 9654 10290 10344 11135 11069 10956 10873 ...
 $ status : Factor w/ 2 levels "A","D": 2 2 2 2 2 2 2 2 2 2 ...
 $ T.categ: Factor w/ 8 levels "hs","hsid","id",..: 1 1 1 5 1 1 8 1 1 2 ...
 $ age    : int  35 53 42 44 39 36 36 31 26 27 ...

La primera línia informa de que es tracta d'una taula de dades amb 2.843 observacions i 7 variables. En les línies següents es llisten les variables i de cada una se'n presenta el tipus. P. ex., l'estat és un factor amb 4 nivells diferents i la data del diagnòstic és un nombre enter (int). Un factor és una variable que només pot prendre un limitat de valors (p. ex., l'estat només te 4 valors possibles).

Per llistar les dades, simplement s'escriu el nom de la taula de dades i es prem enter:

DADES                 # Visualitzar les dades
  SEXE EDAT
1 Dona   20
2 Home   NA
3 Home   30
4 Dona   24
5 Dona   25
6 Dona   21
7 Home   32
8 Home   35

Si en lloc d'imprimir tota la taula de dades, només es vol tenir una idea de com són les dades llistant els primers registres[1]. Això s'aconsegueix amb l'ordre head():

 
> head(DADES)                                # Llistar els sis primers registres
  SEXE EDAT
1 Dona   20
2 Home   NA
3 Home   30
4 Dona   24
5 Dona   25
6 Dona   21

Per les dades de les dades de cotxe de la taula mtcars:

 
> head(mtcars)                               # Llistar els sis primers registres
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

Es pot obtenir una visualització de les dades en forma de taula (no molt elegant) amb l'ordre edit(<nom del fitxer>) que provoca que s'obri una finestra mostrant les dades. Aquesta finestra permet modificar les dades, però no s'aconsella modificar-les aquí ([2], pàg. 20-21).

Es pot obtenir una visió ràpida del contingut d'una taula amb l'ordre summary(<nom del fitxer>):

> summary(DADES)
   SEXE        EDAT      
 Dona:4   Min.   :20.00  
 Home:4   1st Qu.:22.50  
          Median :25.00  
          Mean   :26.71  
          3rd Qu.:31.00  
          Max.   :35.00  
          NA's   :1

Entre la informació proporcionada, hi ha el nombre de valors desconeguts de cada una de les variables. Si es volgués saber el nombre total de valors desconeguts en la base de dades, es pot determinar amb les funcions sum(is.na()):

> DADES = data.frame(INICIALS=c("PG", "GB", "NR", "IR", "NA"),
+                    SEXE=c(NA, "Home", "Dona", "Dona", "Home"),
+                    EDAT=c(50, NA, 20, 18, 30))                          # Dades de 5 persones
> DADES                                                                   # Llistar les dades
  INICIALS SEXE EDAT
1       PG <NA>   50
2       GB Home   NA
3       NR Dona   20
4       IR Dona   18
5       NA Home   30
> sum(!is.na(DADES))             # Nombre de valors no desconeguts en tota la taula
[1] 13
> sum(is.na(DADES))              # Nombre de valors desconeguts en tota la taula
[1] 2

Per recuperar les dades d'una cel·la, només cal indicar les seves coordinades (nombre de fila i de columna) entre l'operador claudàtors ("[]"). Les dues coordenades s'han de separar per una coma. La primera coordenada ha de ser la posició de la fila, a continuació, una coma, i finalment la posició de la columna. L'ordre és important.

Per exemple, l'edat dels individu 4 de la taula DADES s'obté amb [4, 3]:

 
> DADES[4, 3]                                # Visualitzar la cel·la 2a de la 4a fila
[1] 18

D'altra banda, en lloc de les coordenades numèriques, també es pot utilitzar el nom de la fila i els noms de les columna:

 
> DADES[4, "EDAT"]                           # Visualitzar l'edat de la 4a persona
[1] 18

Si el nom de la fila és un text, aquest ha d'anar entre cometes. P. ex., si es vol visualitzar el nombre de cilindres del Hornet Sportabout de la base de dades mtcars, el nom de la fila (Hornet Sportabout) s'especificarà entre cometes:

> mtcars["Hornet Sportabout", "cyl"]                 # Nombre de cilindres del primer cotxe
[1] 8

Tipus de variables

modifica

El tipus de variables que gestiona el R (que, per simplificar, es fa sinònim de "tipus de dades") i que es poden trobar en una taula de dades són:

  • Numèriques: per emmagatzemar nombres reals: els nombres que es poden obtenir quan es mesuren magnituds contínues.
  • Enters: per emmagatzemar nombres enters: . . . -2, -1, 0, 1, 2, . . .
  • Complexes: per emmagatzemar nombres complexos.
  • Lògics: per emmagatzemar "Verdader / Fals" (true / false).
  • Caràcter: per emmagatzemar tant nombres com lletres o altres caràcters.

Aquest són els tipus més bàsics de dades i a partir d'aquests es construeixen les altres (p. ex., vectors, matrius o taules de dades). Un tipus especial d'aquestes construccions són els anomenats "factors", que és una manera molt útil d'emmagatzemar variables qualitatives en una taula de dades. Es comenten una mica més endavant.

Es poden utilitzar per emmagatzemar dades tant qualitatives com quantitatives. Per exemple, la variable qualitativa "sexe" es podria emmagatzemar en una variable caràcter que contingués "H" o "D" però també es podria emmagatzemar en una numèrica o enter que contingues, p. ex., un "1" en el cas dels homes i un "2" en el cas de les dones.

Les variables caràcter es poden manegar amb les funcions per text.

Per saber el tipus de variable es pot utilitzar l'ordre class():

 
> X = 2.5         # Assigna un nombre decimal a la variable X 
> X               # Mostrar el valor de X 
[1] 2.5
> class(X)        # Mostrar el tipus de variable (o "classe") de X
[1] "numeric"

> L = T           # Assigna True a la variable L
> L               # Mostrar el valor de L
[1] TRUE
> class(L)        # Mostrar el tipus de variable (o "classe") de L 
[1] "logical"

> C = "T"         # Assigna la lletra T a la variable C
> C               # Mostrar el valor de la variable C
[1] "T"
> class(C)        # Mostrar el tipus de variable de C
[1] "character"

> NOM = "Xavier"  # Assigna el nom Xavier a la variable NOM
> NOM             # Mostrar el valor de NOM 
[1] "Xavier"
> class(NOM)      # Mostrar el tipus de variable (o "classe") de NOM
[1] "character"

Els nombres en R

modifica

Els nombres en R es tracten habitualment com a variables numèriques (com un nombre real). Si es vol crear un enter, s'ha d'especificar el sufix "L" (majúscula) després del nombre:

> N=4             # Assignar el nombre 4 a la variable N
> N               # Mostrar el valor de la variable N
[1] 4
> class(N)        # Mostrar el tipus de variable de N
[1] "numeric"

> E=4L            # Assignar el enter 4 (sufix "L") a la variable E
> E               # Mostrar el valor de la variable E
[1] 4
> class(E)        # Mostrar el tipus de variable de E
[1] "integer"

Nombres especials

modifica

En R existeix el nombre especial Inf (amb la "I" en majúscules) que representa l'infinit. Pot intervindre en els càlculs:

> 1/ Inf
[1] 0

> Inf/0
[1] Inf

El valor NaN ("Not a number") representa un valor indefinit com, p. ex., el resultat de dividir zero per zero:

> 0/0
[1] NaN

També es pot considerar com un valor desconegut.

Variables lògiques

modifica

Un valor lògic sovint es crea quan es compara variables.

> X = 1
> Y = 2             
> Z = X > Y        # És X més gran que Y? 
> Z                # Mostrar el valor de Z 
[1] FALSE
> class(Z)         # Mostrar el tipus de variable (o "classe") de Z
[1] "logical"

Aquest fet es pot aprofitar per crear variables dicotòmiques amb un "1" si es compleix una determinada condició i un "0" en cas contrari. Suposi que es té una taula de dades amb el sexe i l'edat de 8 individus:

> DADES = data.frame(SEXE=c("Dona", "Home", "Home", "Dona", "Dona", "Dona", "Home", "Home"),
+                    EDAT=c(20,NA,30,24,25,21,32,35))  
> head(DADES)      # Mostrar els primers registres de la taula de dades
  SEXE EDAT
1 Dona   20
2 Home   NA
3 Home   30
4 Dona   24
5 Dona   25
6 Dona   21

Es crea una nova variable amb el valor "verdader" per als individus amb una edat igual o major a 30 anys:

> DADES$EDATMG29 = DADES$EDAT >= 30
> DADES
  SEXE EDAT EDATMG29
1 Dona   20    FALSE
2 Home   NA       NA
3 Home   30     TRUE
4 Dona   24    FALSE
5 Dona   25    FALSE
6 Dona   21    FALSE
7 Home   32     TRUE
8 Home   35     TRUE

Si es vol que tingui "1" quant l'edat és de 30 o més anys i un 0 si és menor, es pot convertir la variable lògica en un nombre amb la funció as.numeric:

> DADES$EDATMG29 = as.numeric(DADES$EDAT >= 30)
> DADES
  SEXE EDAT EDATMG29
1 Dona   20        0
2 Home   NA       NA
3 Home   30        1
4 Dona   24        0
5 Dona   25        0
6 Dona   21        0
7 Home   32        1
8 Home   35        1

Factors

modifica

Els factors son un tipus de variables que s'utilitzen per emmagatzemar dades categòriques. Són molt útils si, per exemple, les dades s'analitzaran amb models lineals com la regressió lineal, ja que els tracta d'una forma especial que facilita molt l'anàlisi de les dades i la interpretació dels resultats.

Es poden crear amb la funció factor(). P. ex., si una base de dades recull el sexe de 8 individus codificat com 1=Home i 2=Dona, amb la funció factor() es pot convertir en un factor amb dos nivells (1 i 2):

> DADES = data.frame(SEXE=c(2, 1, 1, 2, 2, 2, 1, 1))  # Sexe de 8 individus
> class(DADES$SEXE)                                   # Mostrar el tipus de variable
[1] "numeric"

> DADES$SEXE = factor(DADES$SEXE)                     # Convertir la variable en un factor
> class(DADES$SEXE)                                   # Mostrar el tipus de variable
[1] "factor"
> DADES$SEXE                                          # Mostrar els valors de la variable
[1] 2 1 1 2 2 2 1 1
Levels: 1 2

En mostrar els valors d'un variable factor, mostra tant el valors individuals com el diferents nivells de la variables (levels).

Si en la taula de dades la variable sexe està introduïda com "Home" i "Dona", el R ja la considera directament com un factor:

> DADES = data.frame(SEXE=c("Dona", "Home", "Home", "Dona", "Dona", "Dona", "Home", "Home"))
> class(DADES$SEXE)                                   # Mostrar el tipus de variable
[1] "factor"

> DADES$SEXE                                          # Mostrar els valors de la variable
[1] Dona Home Home Dona Dona Dona Home Home
Levels: Dona Home

En realitat, els valors no estan emmagatzemat com "Home" i "Dona", sinó que internament hi ha "1" i "2" i cada valor està lligat a la seva etiqueta ("Home" i "Dona"). Això es posa en evidència amb l'ordre unclass() que mostra la seqüència de "1" i "2" que internament utilitza el R:

> DADES = data.frame(SEXE=c("Dona", "Home", "Home", "Dona", "Dona", "Dona", "Home", "Home"))
> unclass(DADES$SEXE)
[1] 1 2 2 1 1 1 2 2
attr(,"levels")
[1] "Dona" "Home"

La variable DADES$SEXE té un atribut intern que és l'etiqueta dels dos nivells ("Home" i "Dona").

En una variable factor, els nivells o valors de la variable qualitativa poden estar ordenats. Això és important en utilitzar els models lineals. Quan s'inclou una variable d'aquest tipus com a variable independent en un model lineal, sovint es desitja definir una de les categories de la variable com a "categoria de referència". Per defecte, R utilitza la primera categoria seguint l'ordre alfabètic. P. ex., per la variable sexe anterior, s'utilitzaria les dones com a categoria de referència. Si es vol que la categoria de referència siguin els homes, es pot canviar l'ordre dels nivells de la variable factor utilitzant l'argument levels = c("Home", "Dona"):

> DADES = data.frame(SEXE=c("Dona", "Home", "Home", "Dona", "Dona", "Dona", "Home", "Home"))
> DADES$SEXE                                                 # La 1a categoria és Dona
[1] Dona Home Home Dona Dona Dona Home Home
Levels: Dona Home

> DADES$SEXE = factor(DADES$SEXE, levels = c("Home", "Dona"))  # La 1a categoria és Home
> DADES$SEXE                                                 # La 1a categoria és Home
[1] Dona Home Home Dona Dona Dona Home Home
Levels: Home Dona

Ara la categoria de referència, si s'introdueix la variable sexe com una variable independent en un model lineal, seria els homes.

L'ordre table() mostra la freqüència de cada una de les categories:

> DADES = data.frame(SEXE=c("Dona", "Home", "Home", "Dona", "Dona", "Dona", "Home", "Home"))
> table(DADES$SEXE)                                   # Mostra la freqüència de cada categoria

Dona Home 
   4    4

Modificar variables

modifica

Reanomenar variables (per fer)

modifica

XXX Per fer Revisar http://wiki.stdout.org/rcookbook/Manipulating%20data/Renaming%20columns%20in%20a%20data%20frame/ XXX Exemple:

> DADES <- data.frame(SEXE=c("Dona", "Home", "Home", "Dona"), 
+                     COLOR=c("vermell", "blau", "verd", "vermell"),
+                     EDAT=c(20, 25, 30, 35))
> head(DADES)
  SEXE   COLOR EDAT
1 Dona vermell   20
2 Home    blau   25
3 Home    verd   30
4 Dona vermell   35

# Reanomenar SEXE a GENERE:
> colnames(DADES)[ colnames(DADES) == "SEXE" ] = "GENERE"
> head(DADES)
  GENERE   COLOR EDAT
1   Dona vermell   20
2   Home    blau   25
3   Home    verd   30
4   Dona vermell   35

Recodificar variables (per fer)

modifica

Canviar el tipus de variables

modifica

Si el contingut de la variable ho permet, es poden transformar d'un tipus a un altre.

Les funcions as.numeric i as.integer permeten canviar el tipus de variable d'enter a numèrica i viceversa:

> E=3L                     # Assigna a E el valor enter 3
> class(E)                 # Tipus de variable
[1] "integer"

> N=as.numeric(E)          # Assignar a N e valor de E, però com un nombre
> class(N)                 # Tipus de variable
[1] "numeric"

> E2=as.integer(N)         # Assignar a E2 el valor de N, però com un enter  
> class(E2)                # Tipus de variable
[1] "integer"

La funció as.logical() converteix la variable en una variable lògica amb valor TRUE si la variable té un valor diferent de zero i amb un valor FALSE si val zero:

> N=5                      # Assigna a N el valor numèric 5
> V=as.logical(N)          # Assigna a V els valor 5 com una variable lògica
> V                        # Mostra el valor de la variable V
[1] TRUE

> N=0                      # Assigna a N el valor numèric 5
> F=as.logical(N)          # Assigna a F els valor 0 com una variable lògica
> F                        # Mostra el valor de la variable F
[1] FALSE

Aquesta funció és útil per a crear una nova variable en una taula de dades. P. ex., el nombre de bosses de sang que varen rebre quatre malalts intervinguts quirúrgicament va ser de 2, 0, 3 i 1. La funció as.logical() permet crear fàcilment una nova variable TRANSFUSIO amb TRUE si al malalt se li ha administrat alguna bossa de sang i FALSE si no;

> DADES = data.frame(N_BOSSES=c(2, 0, 3, 1))             # Nombre de bosses de sang que varen rebre 4 malalts
> class(DADES$N_BOSSES)                                  # Mostra el tipus de variable
[1] "numeric"

> DADES$TRANSFUSIO = as.logical(DADES$N_BOSSES)          # Assignar verdader o fals segons hagin rebut o no transfusió
> class(DADES$TRANSFUSIO)                                # Mostra el tipus de variable
[1] "logical"
> DADES$TRANSFUSIO                                       # Mostra els valors de la variable
[1]  TRUE FALSE  TRUE  TRUE

La funció as.character() permet, per exemple, convertir en una variable caràcter una de numèrica o una de lògica:

> # Numèrica a caràcter
> N=5                      # Assigna a N el valor numèric 5
> C=as.character(N)        # Assignar a C el valor de N com a caràcter
> class(C)                 # Mostra el tipus de variable
[1] "character"
> C                        # Mostra el valor de C
[1] "5"


> # Lògica a caràcter
> L=T                      # Assigna a L el valor lògic TRUE
> class(L)                 # Mostra el tipus de variable
[1] "logical"
> L                        # Mostra el valor de L
[1] TRUE
               
> C=as.character(L)        # Assigna a C el valor de L com a caràcter
> class(C)                 # Mostra el tipus de variable
[1] "character"
> C                        # Mostra el valor de C
[1] "TRUE"

La variable lògica amb valor TRUE>, al convertir-se en un caràcter, es converteix en el caràcter "TRUE".

Centrar variables quantitatives

modifica

Es pot centrar una variable respecte a la mitjana amb la funció scale():[3]

> # Dades de prova
> DADES <- data.frame(SEXE=c("Dona", "Home", "Home", "Dona"), 
+                     COLOR=c("vermell", "blau", "verd", "vermell"),
+                     EDAT=c(20, 25, 30, 35))
> DADES
  SEXE   COLOR EDAT
1 Dona vermell   20
2 Home    blau   25
3 Home    verd   30
4 Dona vermell   35

> DADES$EDAT_C = scale(DADES$EDAT,      # Centrar l'edat a la seva mitjana
+                      center = TRUE,
+                      scale = FALSE)

> DADES
  SEXE   COLOR EDAT EDAT_C
1 Dona vermell   20   -7.5
2 Home    blau   25   -2.5
3 Home    verd   30    2.5
4 Dona vermell   35    7.5

> mean(DADES$EDAT_C)                    # Verificació: mitjana edat centrada = 0
[1] 0

L'ordre scale() pot tenir els següents arguments:

  • El nom d'una variable numèrica
  • center: Si és TRUE, a cada un dels valors de la variable numèrica se li resta la mitjana de la variable. Si és FALSE, no fa la resta.
  • scale: si és TRUE i center també és TRUE, els valors centrats de la variable es divideixen per la desviació estàndard de la variable. Si center és FALSE, cada valor el divideix per la rel quadrada de la mitjana.

Crear variables dicotòmiques

modifica

Consisteix en transformar cada categoria d'una variable qualitativa en una nova variable que indiqui per cada individu si pertany o no a aquesta categoria [4]. Exemple, suposem que es té una taula de dades amb el sexe de quatre individus:

> DADES <- data.frame(SEXE=c("Dona", "Home", "Home", "Dona"))          # Es crea una taula de dades amb el sexe
> head(DADES)                                                          # Llistar els 1rs registres
  SEXE
1 Dona
2 Home
3 Home
4 Dona

Per incloure en les dades les dues variable dicotòmiques corresponents als homes i a les dones:

> TMP = data.frame(model.matrix( ~ SEXE - 1, data=DADES))              # Fitxer temporal amb les noves variables
> head(TMP)
  SEXEDona SEXEHome
1        1        0
2        0        1
3        0        1
4        1        0

> DADES = cbind(DADES, TMP)                                            # cbind permet ajuntar les dades originals amb la temporal
> head(DADES)
  SEXE SEXEDona SEXEHome
1 Dona        1        0
2 Home        0        1
3 Home        0        1
4 Dona        1        0

S'ha creat dues noves variables. L'una, p. ex., s'anomena SEXEDona que pren el valor "1" si l'individu és una dona i "0" si no ho és.

L'1 a la fórmula indica que no es vol un terme constant (ja que model.matrix està bàsicament dissenyat per fer front als models de regressió).

Si es vol fer per més d'una variable, el procés és el mateix:

> DADES <- data.frame(SEXE=c("Dona", "Home", "Home", "Dona"), COLOR=c("vermell", "blau", "vrd", "vermell"), EDAT=c(20,25,30,35))
> head(DADES)
  SEXE   COLOR EDAT
1 Dona vermell   20
2 Home    blau   25
3 Home     vrd   30
4 Dona vermell   35

> TMP = data.frame(model.matrix( ~ SEXE + COLOR - 1, data=DADES))
> head(TMP)
  SEXEDona SEXEHome COLORvermell COLORvrd
1        1        0            1        0
2        0        1            0        0
3        0        1            0        1
4        1        0            1        0

> DADES = cbind(DADES, TMP)
> head(DADES)
  SEXE   COLOR EDAT SEXEDona SEXEHome COLORvermell COLORvrd
1 Dona vermell   20        1        0            1        0
2 Home    blau   25        0        1            0        0
3 Home     vrd   30        0        1            0        1
4 Dona vermell   35        1        0            1        0

Els valors desconeguts

modifica

Com ja s'ha dit, en R el valors desconeguts es representen pel símbol NA ("not available"). A diferència de, p. ex., el SAS, en R s'utilitza el mateix símbol per les variables quantitatives i qualitatives. Per exemple, es tenen les dades de les inicials, sexe i edat de 5 persones:

> DADES = data.frame(INICIALS=c("PG", "GB", "NR", "IR", "NA"),
+                    SEXE=c(NA, "Home", "Dona", "Dona", "Home"),
+                    EDAT=c(50, NA, 20, 18, 30))                          # Dades de 5 persones
> DADES                                                                   # Llistar les dades
  INICIALS SEXE EDAT
1       PG <NA>   50
2       GB Home   NA
3       NR Dona   20
4       IR Dona   18
5       NA Home   30

El sexe de la primera persona i l'edat de la segona són desconeguts. En els dos casos, malgrat que una variable és qualitativa i l'altre quantitativa, els valors desconeguts s'indiquen amb NA. Però amb la diferència de que en la variable qualitativa, el símbol NA es llista com <NA> per diferenciar-lo del text "NA" (valor, p. ex., de les inicials de la darrera persona). Per tant, en aquesta taula de dades es tenen tres NA:

  • Les inicials de la darrera persona. Es llista com NA, indicant que és un valor vàlid de la variable INICIALS. El R l'interpreta com un valor legítim, no com un valor desconegut
  • El <NA> de la variable SEXE de la primera persona. El R l'interpreta com una valor desconegut. Com que la variable és qualitativa i el valor NA pot ser una valor legítim per una variable d'aquest tipus, i per indicar que no és un text, sinó un valor desconegut, es llista entre "< >".
  • El NA de l'edat de la segona persona. Com que la variable és quantitativa i, per tant, no pot tenir el valor NA, és llista tal qual, ja que no es pot confondre amb un valor legítim

Per tant, si la variable és qualitativa els valors desconeguts es mostren com <NA> i si és numèrica com NA.

Es pot saber el nombre de valors no desconeguts o desconeguts amb les funcions sum(is.na()):

> sum(!is.na(DADES))             # Nombre de valors no desconeguts en tota la taula
[1] 13
> sum(is.na(DADES))              # Nombre de valors desconeguts en tota la taula
[1] 2
> sum(is.na(DADES$EDAT))         # Nombre de valors desconeguts de l'edat
[1] 1

Recodificar els valors desconeguts

modifica

Sovint, en les bases de dades externes, els valors desconeguts estan codificats amb algun valor especial (p. ex., "-9"). Abans de treballar a les dades, cal indicar al R que aquests valors no són legítims, sinó que són desconeguts. Es pot fer: [5]

> DADES = data.frame(INICIALS=c("PG", "GB", "NR", "IR", "NA"),
+                    SEXE=c("-9", "Home", "Dona", "Dona", "Home"),
+                    EDAT=c(50, -9, 20, 18, 30))                          # Dades de 5 persones. Valors desconeguts: -9
> DADES                                                                   # Llistar les dades
  INICIALS SEXE EDAT
1       PG   -9   50
2       GB Home   -9
3       NR Dona   20
4       IR Dona   18
5       NA Home   30

> DADES[DADES$SEXE == "-9", "SEXE"] = NA                                  # Es recodifica el desconegut del SEXE
> DADES[DADES$EDAT == -9, "EDAT"] = NA                                    # Es recodifica el desconegut de l'EDAT

> DADES
  INICIALS SEXE EDAT
1       PG <NA>   50
2       GB Home   NA
3       NR Dona   20
4       IR Dona   18
5       NA Home   30

Les dades són les mateixes que abans, però ara els valors desconeguts estan codificats com a "-9". Abans de continuar se li indica al R que els "-9" són valors desconeguts canviant els "-9" per "NA".

També es pot recodificar amb la expressió DADES$EDAT[DADES$EDAT == -9] ([2] pag. 65):

# Dades de 5 persones. Valors desconeguts: -9:
> DADES = data.frame(INICIALS=c("PG", "GB", "NR", "IR", "NA"),
+                    SEXE=c("-9", "Home", "Dona", "Dona", "Home"),
+                    EDAT=c(50, -9, 20, 18, 30))
> DADES                                         # Llistar les dades
  INICIALS SEXE EDAT
1       PG   -9   50
2       GB Home   -9
3       NR Dona   20
4       IR Dona   18
5       NA Home   30
> DADES$SEXE[DADES$SEXE == "-9"] = NA           # Es recodifica el desconegut del SEXE
> DADES$EDAT[DADES$EDAT == -9] = NA             # Es recodifica el desconegut de l'EDAT
> DADES
  INICIALS SEXE EDAT
1       PG <NA>   50
2       GB Home   NA
3       NR Dona   20
4       IR Dona   18
5       NA Home   30

El resultat és el mateix que abans.

Verificar si un valor és desconegut

modifica

En R la funció is.na() permet verificar si un valor determinat és o no desconegut. Per exemple, es pot verificar si les inicials de la cinquena persona són desconegudes (resposta: no) o si el sexe de la primera persona ho és (resposta: sí):

> is.na(DADES[5, "INICIALS"])                                             # Inicials de la cinquena persona
[1] FALSE

> is.na(DADES[1, "SEXE"])                                                 # Sexe de la primera persona
[1] TRUE

> is.na(DADES[1, "EDAT"])                                                 # Edat de la primera persona
[1] FALSE

> is.na(DADES[2, "EDAT"])                                                 # Edat de la segona persona
[1] TRUE

També es pot verificar quins valors d'una variable són desconeguts:

> is.na(DADES$SEXE)                                                       # El sexe és desconegut?
[1]  TRUE FALSE FALSE FALSE FALSE

Per cada persona, la funció torna el valor TRUE o FALSE en funció de si el sexe és o no desconegut. També es podria interrogar tota la taula de dades:

> is.na(DADES)                                                            # Els valors són desconeguts?
     INICIALS  SEXE  EDAT
[1,]    FALSE  TRUE FALSE
[2,]    FALSE FALSE  TRUE
[3,]    FALSE FALSE FALSE
[4,]    FALSE FALSE FALSE
[5,]    FALSE FALSE FALSE

Si la funció is.na va precedida per un signe d'admiració, en lloc de verificar si un valor és desconegut, verifica si és conegut:

> !is.na(DADES)                                                            # Els valors són coneguts?
     INICIALS  SEXE  EDAT
[1,]     TRUE FALSE  TRUE
[2,]     TRUE  TRUE FALSE
[3,]     TRUE  TRUE  TRUE
[4,]     TRUE  TRUE  TRUE
[5,]     TRUE  TRUE  TRUE

Operadors amb valors desconeguts

modifica

Tant en les expressions aritmètiques com en les lògiques, si hi intervenen valors desconeguts, el resultat serà també desconegut ([2] pàg. 55-56). Si l'edat és desconeguda i es pregunta si aquesta és major de 5, la resposta no és FALSE (NA no és més gran de 5), sinó NA:

> EDAT = NA        # Edat desconeguda
> EDAT
[1] NA
> EDAT > 5         # És l'edat més gran de 5?
[1] NA             # Resposta: NA, en lloc de FALSE

Per tant el resultat d'una condició amb un valor desconegut, és desconegut.

Com a conseqüència d'aquest fet, a diferència de, p. ex., el SAS en el que es pot verificar si un valor és desconegut amb la expressió "EDAT = ." (el "." és el símbol de desconegut per les variables quantitatives en SAS), en el R una igualtat així no és correcta ([2] pag. 56). Si es verifica si l'edat de la primera persona de la taula DADES te 50 anys, la resposta proporcionada és correcta (sí), però si es verifica si l'edat de la mateixa persona és desconeguda, o si la de la segona ho és, la resposta és sempre NA, que és una resposta incorrecta (la resposta hauria d'haver estat FALSE per la primera persona i TRUE per la segona:

> DADES[1, "EDAT"] == 50                                                  # Resposta correcta
[1] TRUE

> DADES[1, "EDAT"] == NA                                                  # Resposta incorrecta
[1] NA

> DADES[2, "EDAT"] == NA                                                  # Resposta incorrecta
[1] NA

Per tant, els operadors de comparació no són adequats per verificar els valors desconeguts. S'ha d'utilitzar la funció is.na().

I, per acar-ho d'adobar, si es seleccionen casos utilitzant el mètode de la indexació (veure indexació), si una condició torna NA, l'element és seleccionat com si la condició fos veritat ([2] pàg. 56). P. ex., si per aquest mètode es vol seleccionar a totes les persones de més de 30 anys, aquells individus amb edat desconeguda també seran seleccionats. Per tant, la mostra seleccionada serà incorrecta.

Funcions aritmètiques amb valors desconeguts

modifica

Ja s'ha comentat que les funcions aritmètiques (com, p. ex., sum()) i les d'estadística elemental (com, p. ex., mean(), median(), range() o sd), tornen un valor desconegut si algun valor és desconeguts. :

> mean(DADES$EDAT)
[1] NA
> sum(DADES$EDAT)
[1] NA

Per evitar aquest tipus de problemes, la majoria de funcions numèriques tenen l'opció na.rm (NA remove) que, si se li assigna el valor de TRUE, elimina els valors desconeguts en l'anàlisi i només fa els càlculs amb els valors restants ([6], pàg. 80):

> mean(DADES$EDAT, na.rm=TRUE)
[1] 29.5
> sum(DADES$EDAT, na.rm=TRUE)
[1] 118

Altres ordres més complexes, no tenen aquesta opció (p. ex., l'ordre lm de la regressió lineal) i el que fan amb els valors desconeguts depèn de l'opció que es tingui definida per omissió amb l'opció na.action. Es pot saber el valor per omissió amb l'ordre getOption("na.action"):

> getOption("na.action")
[1] "na.omit"

Es pot canviar l'opció amb l'ordre na.action. Els possibles valors són [7]:

  • na.omit i na.exclude: exclou els valors mancants.
  • na.pass: inclou els valors mancants.
  • na.fail: fa l'anàlisi només si no hi ha cap valor mancant.

Seleccionar observacions sense valors desconeguts

modifica

Amb l'ordre complete.cases(<DADES>) es poden identificar els registres que no tenen cap valor desconegut en totes les variables. Un cop identificades, es pot utilitzar aquesta informació per filtrar aquests casos:

> # Dades de 5 persones
> DADES = data.frame(INICIALS=c("PG", "GB", "NR", "IR", "NA"),
+                    SEXE=c(NA, "Home", "Dona", "Dona", "Home"),
+                    EDAT=c(50, NA, 20, 18, 30))
> DADES                                 # Llistar les dades
  INICIALS SEXE EDAT
1       PG <NA>   50
2       GB Home   NA
3       NR Dona   20
4       IR Dona   18
5       NA Home   30
> DADES_SD = complete.cases(DADES)      # Identificar casos sense valors desconeguts
> DADES_SD                              # Tenen tots els valors
[1] FALSE FALSE  TRUE  TRUE  TRUE
> DADES[DADES_SD,]                      # Es seleccionen els casos sense valors desconeguts
  INICIALS SEXE EDAT
3       NR Dona   20
4       IR Dona   18
5       NA Home   30

Si per a algunes dades manquen els valors, caldria esbrinar-ne el motiu. Concretament, és important establir si els valors mancants es donen més per determinats valors de les variables, o són aleatoris. En tot cas, cal tenir en compte de que poden existir millors alternatives que eliminar els valors mancants de l'anàlisi. Existeixen mètodes per estimar aquests valors mancants a partir de les dades restants.

Seleccionar variables

modifica

Amb la funció subset

modifica

Per eliminar pel seu nom una o més variables (columnes) d'una taula de dades es pot utilitzar la ordre subset(). Per exemple si és vol eliminar de la taula de dades:

> DADES = data.frame(INICIALS=c("PG", "GB", "NR", "IR", "NA"),
+                    SEXE=c(NA, "Home", "Dona", "Dona", "Home"),
+                    EDAT=c(50, NA, 20, 18, 30),
+                    GRUP_S=c("B", "0", "B", "A", "B"))
> names(DADES)
[1] "INICIALS" "SEXE"     "EDAT"     "GRUP_S"

la variable INICIALS, s'executa l'ordre subset(DADES, select = -INICIALS) [8]:

> DADES <- subset(DADES, select = -INICIALS)
> names(DADES)
[1] "SEXE"   "EDAT"   "GRUP_S"

Per eliminar dues o més variables (p. ex., SEXE i GRUP_S), en l'ordre anterior s'introduiran els noms amb la funció c() precedida amb el signe "-":

> DADES = subset(DADES, select = -c( SEXE, GRUP_S))
> names(DADES)
[1] "INICIALS" "EDAT"

Per a eliminar totes les variables entre dos (p. ex., eliminar totes les variables entre SEXE i GRUP_S):

> DADES = subset(DADES, select = -c( SEXE : GRUP_S))
> names(DADES)
[1] "INICIALS"

XXX Consultar

XXX

Seleccionar observacions

modifica

XXX Consultar

XXX

Per indexació

modifica

Amb la funció subset

modifica

La funció subset selecciona les observacions d'una taula de dades que compleixen una condició. La sintaxi és:

> subset(<Nom de la taula de dades>, <condició>)

XXX Per fer

## Seleccionar un subconjunt d'observacions d'una taula de dades
> data(BP, package="epicalc")             # Carregar les dades en memòria
> head(BP)                                # Llistar el primer registre
  id    sex sbp dbp saltadd  birthdate
1  1   male 110  80     yes 1943-01-06
2  2 female  85  55      no 1969-01-03
3  3   male 167 112     yes 1933-06-10
4  4 female 145 110     yes 1946-11-23
5  5 female 180 120      no 1941-01-03
6  6   male 112  78      no 1942-04-16

## Seleccionar les dones
## Crea una nova taula de dades anomenada BP_DONES que només inclou les dones:
> BP_DONES = subset(BP, sex == "female")
> head(BP_DONES)
   id    sex sbp dbp saltadd  birthdate
2   2 female  85  55      no 1969-01-03
4   4 female 145 110     yes 1946-11-23
5   5 female 180 120      no 1941-01-03
7   7 female 110  70      no 1969-01-11
10 10 female 133  75     yes 1955-09-22
11 11 female 150  72     yes 1938-12-16

## Indicar la variable SEX per la seva posició (2a columna de la taula de dades)
> BP_DONES = subset(BP, BP[, 2] == "female")
> head(BP_DONES)
   id    sex sbp dbp saltadd  birthdate
2   2 female  85  55      no 1969-01-03
4   4 female 145 110     yes 1946-11-23
5   5 female 180 120      no 1941-01-03
7   7 female 110  70      no 1969-01-11
10 10 female 133  75     yes 1955-09-22
11 11 female 150  72     yes 1938-12-16


## Seleccionar les dones amb una pressió arterial diastòlica inferior a 100
> BP_DONES_PADM100 = subset(BP, sex == "female" & dbp < 100)  # Només un "&"
> head(BP_DONES_PADM100)
   id    sex sbp dbp saltadd  birthdate
2   2 female  85  55      no 1969-01-03
7   7 female 110  70      no 1969-01-11
10 10 female 133  75     yes 1955-09-22
11 11 female 150  72     yes 1938-12-16
16 16 female 126  78      no 1955-08-29
17 17 female 182  96     yes 1941-10-08

XXX

Amb la funció tapply

modifica

Ordenar taula de dades

modifica

Fusionar taules de dades

modifica

Treballar amb dates

modifica

Introducció

modifica

De forma general, en R les dates es poden emmagatzemar en una base de dades (o en altre classe d'objecte) com un text o com un nombre. Per exemple, la data de naixement i la de defunció poden estar emmagatzemada en el fitxer de dades com els textos, p.ex., "14-04-1931" i "07-04-2010". Aquestes dates ens són més fàcilment llegibles que, per exemple, "1931-04-14" (el format estàndard per les dates emmagatzemades com un text en R) o "-14142" (el nombre que estaria en el camp data de naixement si estigues emmagatzemat com un nombre).

Si la data està com un text, per fer operacions amb elles cal primer indicar-li al R que aquell text és una data. Això es fa amb la funció as.Data. Per exemple, si la data de naixement està en el camp "D_NAIX" i amb el format dia-mes-any (amb 4 xifres), per crear un nou camp (D_NAIX_N) que contingui la data com un nombre que es pugui utilitzar per fer operacions aritmètiques, es fa servir la funció as.Date, indicant el format utilitzat:

D_NAIX_N = as.Date(D_NAIX, format="%d-%m-%Y")

Si es vol crear un camp amb els anys des del naixement fins a la defunció, no cal crear uns camps intermedis amb les dates com a nombre. Es pot fer directament:

ANYS = (as.Date(D_DEF, format="%d-%m-%Y") - as.Date(D_NAIX, format="%d-%m-%Y"))/365.25

Si es consulta el valor d'ANYS per aquesta persona, R contestarà:

Time difference of 78.98152 days

I es que al restar dues dates, es crea un objecte de la classe "difftime" que te com unitats els dies si es calcula amb dates. Per evitar això, només cal dir-li que interpreti els anys com un nombre ([9] pàg. 168-9):

ANYS = as.numeric(as.Date(D_DEF, format="%d-%m-%Y") - as.Date(D_NAIX, format="%d-%m-%Y"), units="days")/365.25

Ara, en consultar el valor d'ANYS, R contesta:

78.98152

Si en comptes d'un text, la data s'emmagatzema com un nombre, R la converteix en el nombre de dies que existeixen entre la data i el 01-01-1970 i en pantalla la mostra com a any-mes-dia (p. ex., "1931-04-14").

Existeixen diverses funcions per treballar amb dates en el paquet base. Se'n pot obtenir informació amb l'ordre ?Date o help(Date).

La funció Sys.Date() torna la data actual i les funcions Sys.time() ó date() tornen la data i hora actual:

> Sys.Date()
[1] "2012-07-17"
> Sys.time()
[1] "2012-07-18 11:11:03 CEST"
> date()
[1] "Tue Jul 17 17:08:10 2012"

Dates en format caràcter

modifica

Si la data en el fitxer de dades està com un caràcter, per exemple, com a DD-MM-AAAA (p. ex., 31-01-2012), per poder fer operacions amb aquesta es pot utilitzar la funció as.Date (biblioteca base , no confondre amb as.date de la biblioteca date).

> ## Dates en format caràcter
> DATA1="01-01-2012"
> DATA2="15-01-2012"
> DIF = as.Date(DATA2, format="%d-%m-%Y") - as.Date(DATA1, format="%d-%m-%Y")
> DIF
Time difference of 14 days

El format en que està una data es representa amb una sèrie de codis precedits pel símbol "%". Si existeixen separadors (p.ex., "-" o "/"), també s'han de explicitar en el format. El conjunt de codis de "%" i el seu significat es poden consultar a la pàgina d'ajuda de strptime:

help(strptime)

Alguns d'ells són:

  • %d: dia del mes com a nombre (01-31).
  • %e: dia del mes com un nombre d'una sola xifra (1-31), amb un espai pels dies 1-9.
  • %m: mes com a nombre (01-12).
  • %y: anys amb les dues darreres xifres de l'any.
  • %Y: anys amb quatre xifres.

Convertir una data text en un nombre

modifica

Si es vol emmagatzemar la data com un nombre, es pot utilitzar la funció julian() que converteix la data amb el nombre de dies entre aquesta i el 01-01-1970.

> ## Emmagatzemar la data com un nombre
> DATA1_N=julian(as.Date(DATA1, "%d-%m-%Y"))
> DATA1_N
[1] 15340
attr(,"origin")
[1] "1970-01-01"

Exemple de dates en format text

modifica

El fitxer stroke.csv del paquet ISwR conté tots els casos d'accident vascular cerebral (AVC) d'una ciutat d'Estònia (Tartu), en el període 1991–1993 ([9] pàg. 317-8). Tant la data del AVC (DSTR) com la de defunció (DIED) està en format dia.mes.any ("DD.MM.AAAA") i emmagatzemades en el fitxer com un text:

> ## Dates caràcter en un fitxer
> AVC = read.csv2(system.file("rawdata","stroke.csv", package="ISwR"), na.strings=".")
> ## Es seleccionen només tres variables
> AVC = subset(AVC, select = c(SEX, DIED, DSTR))
> head(AVC)
  SEX       DIED       DSTR
1   1  7.01.1991  2.01.1991
2   1       <NA>  3.01.1991
3   1  2.06.1991  8.01.1991
4   0 13.01.1991 11.01.1991
5   0 23.01.1996 13.01.1991
6   1 13.01.1991 13.01.1991

Per convertir les dates en dates numèriques, es fa servir la funció as.Date ([9] pàg. 167):

> AVC <- transform(AVC, DIED = as.Date(DIED, format="%d.%m.%Y"), 
                        DSTR = as.Date(DSTR, format="%d.%m.%Y"))

> head(AVC)
  SEX       DIED       DSTR
1   1 1991-01-07 1991-01-02
2   1       <NA> 1991-01-03
3   1 1991-06-02 1991-01-08
4   0 1991-01-13 1991-01-11
5   0 1996-01-23 1991-01-13
6   1 1991-01-13 1991-01-13

> summary(AVC$DSTR)                      # Verificar que la data és un nombre
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
"1991-01-02" "1991-11-08" "1992-08-12" "1992-07-27" "1993-04-30" "1993-12-31"

Ara les dues dates estan emmagatzemades internament com a números i es poden fer operacions amb elles.

Dates en format julià

modifica

El calendari julià és un mètode per a identificar la data actual mitjançant el compte del nombre de dies que han passat des d'una data passada i arbitrària. En R la data d'origen utilitzada és el 01-01-1970. En el fitxer Aids2 del paquet MASS existeixen dues dates, la del diagnòstic de la sida i la de defunció del malalt.[10] Les dades del fitxer són:

> data(Aids2, package="MASS")                 # És carregen les dades
> head(Aids2)
  state sex  diag death status T.categ age
1   NSW   M 10905 11081      D      hs  35
2   NSW   M 11029 11096      D      hs  53
3   NSW   M  9551  9983      D      hs  42
4   NSW   M  9577  9654      D    haem  44
5   NSW   M 10015 10290      D      hs  39
6   NSW   M  9971 10344      D      hs  36

Els camps "diag" i "death" estan en forma julià, és a dir, és el nombre de dies entre el 01-01-1970 i la data de diagnòstic de la sida o de la defunció. Les funcions date.mmddyy (paquet date) i as.Date (paquet base) permeten crear una nova variable de tipus data, però directament intel·ligible.

> library(date)
> ## Converteix les dates julianes en dates intel·ligibles amb format ''AA-MM-DD''
> AIDS$DEF = as.Date(date.mmddyy(AIDS$death, sep = "/"), format="%m/%e/%Y")

> head(AIDS)
  state sex  diag death status T.categ age      DEF
1   NSW   M 10905 11081      D      hs  35 90-05-04
2   NSW   M 11029 11096      D      hs  53 90-05-19
3   NSW   M  9551  9983      D      hs  42 87-05-02
4   NSW   M  9577  9654      D    haem  44 86-06-07
5   NSW   M 10015 10290      D      hs  39 88-03-04
6   NSW   M  9971 10344      D      hs  36 88-04-27

Malgrat que en el fitxer la data de defunció es visualitza com una data, internament la data està emmagatzemada com el nombre de dies abans o després del 01-01-1970, i es comporta com un nombre en calcular-ne, p. ex., la mitjana, mediana, el màxim o mínim:

> summary(AIDS$DEF)
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
"83-03-10" "89-03-21" "90-10-05" "90-02-03" "91-07-01" "91-07-01"

En ser internament un nombre, es poden fer operacions aritmètiques. Per exemple, es pot calcular el temps de supervivència a partir del diagnòstic, restant la data de la defunció i del diagnòstic.

> ## Operacions aritmètiques
> ## Conversió del diagnostic amb un format data
> AIDS$DIAG = as.Date(date.mmddyy(AIDS$diag, sep = "/"), format="%m/%e/%Y")
> head(AIDS)
> summary(AIDS$DIAG)

> ## Càlcul del temps de supervivència
> AIDS = transform(AIDS, TEMPS = as.numeric(DEF - DIAG, units = "days")/365.25)
> head(AIDS)
  state sex  diag death status T.categ age      DEF     DIAG     TEMPS
1   NSW   M 10905 11081      D      hs  35 90-05-04 89-11-09 0.4818617
2   NSW   M 11029 11096      D      hs  53 90-05-19 90-03-13 0.1834360
3   NSW   M  9551  9983      D      hs  42 87-05-02 86-02-24 1.1827515
4   NSW   M  9577  9654      D    haem  44 86-06-07 86-03-22 0.2108145
5   NSW   M 10015 10290      D      hs  39 88-03-04 87-06-03 0.7529090
6   NSW   M  9971 10344      D      hs  36 88-04-27 87-04-20 1.0212183

> summary(AIDS$TEMPS)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.3504  0.8761  1.1110  1.5960  6.7620

És habitual tractar el vector de diferències com un nombre i operar com a tal. Però Dalgaard aconsella utilitzar as.numeric i indicar les unitats ([9] pàg.168). Es divideix per 365,25 ja que les unitats d'una diferència de dates són, com a màxim, les setmanes. Per tant no es podria utilitzar simplement units = years per convertir els dies en anys.

Canviar el format

modifica

Per canviar el format d'una data es pot fer servir la funció format(). Tanmateix, s'ha de tenir en compte de que si es canvia el format d'una data d'un fitxer de dades, la data es converteix en un caràcter i cada vegada que es vulguin fer operacions amb ella, s'haurà de fer servir la funció as.Data i indicar en quin format està. Es fa sevir les dades Aids2 del paquet MASS. Les dates estan en format julià:

> data(Aids2, package="MASS")                 # És carregen les dades
> library(date)
> head(Aids2)
  state sex  diag death status T.categ age
1   NSW   M 10905 11081      D      hs  35
2   NSW   M 11029 11096      D      hs  53
3   NSW   M  9551  9983      D      hs  42
4   NSW   M  9577  9654      D    haem  44
5   NSW   M 10015 10290      D      hs  39
6   NSW   M  9971 10344      D      hs  36

> ## Selecció de tres variables
> AIDS=subset(Aids2,  select = c(sex, diag, death))
> head(AIDS)
  sex  diag death
1   M 10905 11081
2   M 11029 11096
3   M  9551  9983
4   M  9577  9654
5   M 10015 10290
6   M  9971 10344

## Convertir les dates julianes en dates intel·ligibles amb format AA-MM-DD
> AIDS$death = as.Date(date.mmddyy(AIDS$death, sep = "/"), format="%m/%e/%Y")
> AIDS$diag = as.Date(date.mmddyy(AIDS$diag, sep = "/"), format="%m/%e/%Y")
> head(AIDS)
  sex     diag    death
1   M 89-11-09 90-05-04
2   M 90-03-13 90-05-19
3   M 86-02-24 87-05-02
4   M 86-03-22 86-06-07
5   M 87-06-03 88-03-04
6   M 87-04-20 88-04-27

Si es volen crear dues noves variables (D_DIAG i D_DEF), en què les dates es mostrin amb el format dia.mes.any (amb un punt com a separador), es pot fer amb la funció format():

> AIDS$D_DIAG = format(AIDS$diag, format="%d.%m.%Y")
> AIDS$D_DEF  = format(AIDS$death, format="%d.%m.%Y")
> head(AIDS)
  sex     diag    death   D_DIAG    D_DEF
1   M 89-11-09 90-05-04 09.11.89 04.05.90
2   M 90-03-13 90-05-19 13.03.90 19.05.90
3   M 86-02-24 87-05-02 24.02.86 02.05.87
4   M 86-03-22 86-06-07 22.03.86 07.06.86
5   M 87-06-03 88-03-04 03.06.87 04.03.88
6   M 87-04-20 88-04-27 20.04.87 27.04.88

> summary(AIDS$D_DIAG)
   Length     Class      Mode 
     2843 character character

La data del diagnòstic ara està en format dia.mes.any (DD.MM.AA), però està emmagatzemada com a caràcter. Els formats són útils per canviar la forma d'una data en les etiquetes de, p. ex., un gràfic.


Treballar amb temps i hores

modifica

Si es tenen les hores com a text, l'R les tracta com a variables qualitatives:

DADES = data.frame(DATA=c("31/10/2014","23/10/2014", "31/10/2014"),
                   HORA=c("01:23", "12:43", "23:09"))))
> str(DADES)
'data.frame':	3 obs. of  2 variables:
 $ DATA: Factor w/ 2 levels "23/10/2014","31/10/2014": 2 1 2
 $ HORA: Factor w/ 3 levels "01:23","12:43",..: 1 2 3

Si es realitza una descriptiva de les variables, al ser qualitatives l'R mostra els efectius de cada valor:

> summary(DADES)
         DATA      HORA  
 23/10/2014:1   01:23:1  
 31/10/2014:2   12:43:1  
                23:09:1

Si cal operar-hi, es poden convertir en format numèric amb l'ordre hm() del paquet lubridate[11] (de passada també s'utilitza la funció dmy del mateix paquet per convertir les dates de text a dates numèriques):

DADES = data.frame(DATA=c("31/10/2014","23/10/2014", "31/10/2014"),
                   HORA=c("01:23", "12:43", "23:09"))
> library(lubridate)
> DADES = data.frame(DATA=c("31/10/2014","23/10/2014", "31/10/2014"),
+                    HORA=c("01:23", "12:43", "23:09"))
> DADES$DATA = dmy(DADES$DATA)
> DADES$HORA = hm(DADES$HORA)
> str(DADES)
'data.frame':	3 obs. of  2 variables:
 $ DATA: POSIXct, format: "2014-10-31" "2014-10-23" ...
 $ HORA:Formal class 'Period' [package "lubridate"] with 6 slots
  .. ..@ .Data : num  0 0 0
  .. ..@ year  : num  0 0 0
  .. ..@ month : num  0 0 0
  .. ..@ day   : num  0 0 0
  .. ..@ hour  : num  1 12 23
  .. ..@ minute: num  23 43 9
> head(DADES)
        DATA       HORA
1 2014-10-31  1H 23M 0S
2 2014-10-23 12H 43M 0S
3 2014-10-31  23H 9M 0S

Ara l'R tracta les hores (i la data) com una variable quantitativa:

> summary(DADES)
      DATA                          HORA           
 Min.   :2014-10-23 00:00:00   Min.   :1H 23M 0S   
 1st Qu.:2014-10-27 00:00:00   1st Qu.:7H 3M 0S    
 Median :2014-10-31 00:00:00   Median :12H 43M 0S  
 Mean   :2014-10-28 08:00:00   Mean   :12H 25M 0S  
 3rd Qu.:2014-10-31 00:00:00   3rd Qu.:17H 56M 0S  
 Max.   :2014-10-31 00:00:00   Max.   :23H 9M 0S


Referències

modifica
  1. 1,0 1,1 Algunes de les idees per a la primera versió d'aquest apartat es van inspirar en Data Frame per Chi Yau
  2. 2,0 2,1 2,2 2,3 2,4 Barnier J. Introduction à R. 20 avril 2012
  3. John M Quick, R Tutorial Series: Centering Variables and Generating Z-Scores with the Scale() Function
  4. Tret de: Dichotomiser des variables sous R
  5. Missing Data per Robert I. Kabacoff
  6. Kabacoff RI. R in action, data analysis and graphics with R. Shelter Island, NY: Manning Publications Co; 2011
  7. R FAQ: How does R handle missing values?
  8. Remove an entire column from a data.frame in R
  9. 9,0 9,1 9,2 9,3 Dalgaard P. Introductory Statistics with R 2ed. New York: Springer; 2008 Error de citació: Etiqueta <ref> no vàlida; el nom «Dalgaard2008» està definit diverses vegades amb contingut diferent.
  10. Aids2, Australian AIDS Survival Data
  11. [R-es Convertir un factor HORA en una hora de R ]

Enllaços externs

modifica