Manual de R (Estadística)/Modificar les dades
Les taules de dades
modificaUna 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
modificaAbans 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
modificaEl 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
modificaEl 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
modificaEnters
modificaEls 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
modificaEn 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
modificaUn 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
modificaEls 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
modificaReanomenar variables (per fer)
modificaXXX 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)
modificaCanviar el tipus de variables
modificaSi 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
modificaEs 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 ésTRUE
, a cada un dels valors de la variable numèrica se li resta la mitjana de la variable. Si ésFALSE
, no fa la resta.scale
: si ésTRUE
icenter
també ésTRUE
, els valors centrats de la variable es divideixen per la desviació estàndard de la variable. Sicenter
ésFALSE
, cada valor el divideix per la rel quadrada de la mitjana.
Crear variables dicotòmiques
modificaConsisteix 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
- Barnier J. Introduction à R. 20 avril 2012, pàg 57-
- Subsetting Data (UCLA)
- Frequently Asked Questions about R How can I subset a data set? (UCLA)
- Select operations on R data frames
- Select operations on R data frames
XXX
Seleccionar observacions
modifica
XXX
Consultar
- Barnier J. Introduction à R. 20 avril 2012, pàg 57-
- Subsetting Data (UCLA)
- Frequently Asked Questions about R How can I subset a data set? (UCLA)
- Select operations on R data frames
- Select operations on R data frames
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,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,0 2,1 2,2 2,3 2,4 Barnier J. Introduction à R. 20 avril 2012
- ↑ John M Quick, R Tutorial Series: Centering Variables and Generating Z-Scores with the Scale() Function
- ↑ Tret de: Dichotomiser des variables sous R
- ↑ Missing Data per Robert I. Kabacoff
- ↑ Kabacoff RI. R in action, data analysis and graphics with R. Shelter Island, NY: Manning Publications Co; 2011
- ↑ R FAQ: How does R handle missing values?
- ↑ Remove an entire column from a data.frame in R
- ↑ 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.
- ↑ Aids2, Australian AIDS Survival Data
- ↑ [R-es Convertir un factor HORA en una hora de R ]
Enllaços externs
modifica