3 Manejo de datos
Una vez importados los datos, ya podemos empezar con nuestros análisis estadísticos. Pero antes, mostraremos cómo crear nuevas variables ya que a menudo, antes de empezar con los análisis necesitamos crear o recodificar nuevas variables que contengan la información que queremos tratar. Seguiremos usando los datos guardados en el fichero multicentric.txt que están cargados en un objeto llamado multicentric. La idea es que en el script que habéis abierto, podéis ir escribiendo estos comandos de R y ver por la consola qué resultados obtenéis. Recordad que cuando escribáis la instrucción, la podéis ejecutar con el boton “Run” que tenéis arriba a la derecha en la ventana del scipt o bien situando el cursor en la linea de comando y clickando “Crtl + R”. En este material, el primer recuadro en gris corresponde al comando que tenéis que escribir en el script (ventana superior-izquierda de RStudio) y el siguiente recuadro en gris muestra lo que veríais por la línea de comandos (ventana inferior-izquierda de R studio)
3.1 Visualización de datos
Empezemos viendo qué datos tenemos. Para ello usaremos la función head()
head(multicentric)
ident pais status edad niveledu fumar edad1sex regcompa totcompa ets co edinico edfinco durco condon embara edademba
1 10001 Brasil Control 64 primaria ex-fumador 16 2 2-3 si no NA NA NA no si 16
2 10002 Brasil Caso 51 primaria fumador 17 1 1 si no NA NA NA no si 17
3 10003 Brasil Control 48 ninguno fumador 14 2 2-3 no no NA NA NA no si 14
4 10004 Brasil Caso 49 ninguno no fumador 23 1 1 no no NA NA NA no si 23
5 10005 Brasil Control 41 primaria no fumador 23 1 1 no no NA NA NA no si 24
6 10006 Brasil Caso 45 primaria fumador 18 1 1 no si 22 38 14 no si 18
nembara pap edad1pap vph
1 9 si 40 negativo
2 13 si 45 positivo
3 11 no NA positivo
4 13 no NA positivo
5 3 si 30 negativo
6 5 si 33 positivo
Para saber cuántos individuos y cuántas variables tenemos en nuestra base de datos podemos usar la función dim()
. nrow()
nos daría el número de individuos y ncol()
el número de variables
dim(multicentric)
[1] 2910 21
nrow(multicentric)
[1] 2910
ncol(multicentric)
[1] 21
También podemos ver qué tipo de variables tenemos y cuáles son sus categorías
str(multicentric)
'data.frame': 2910 obs. of 21 variables:
$ ident : int 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 ...
$ pais : chr "Brasil" "Brasil" "Brasil" "Brasil" ...
$ status : chr "Control" "Caso" "Control" "Caso" ...
$ edad : int 64 51 48 49 41 45 51 42 58 76 ...
$ niveledu: chr "primaria" "primaria" "ninguno" "ninguno" ...
$ fumar : chr "ex-fumador" "fumador" "fumador" "no fumador" ...
$ edad1sex: int 16 17 14 23 23 18 29 19 22 27 ...
$ regcompa: int 2 1 2 1 1 1 1 2 1 1 ...
$ totcompa: chr "2-3" "1" "2-3" "1" ...
$ ets : chr "si" "si" "no" "no" ...
$ co : chr "no" "no" "no" "no" ...
$ edinico : int NA NA NA NA NA 22 30 32 NA NA ...
$ edfinco : int NA NA NA NA NA 38 38 32 NA NA ...
$ durco : int NA NA NA NA NA 14 8 1 NA NA ...
$ condon : chr "no" "no" "no" "no" ...
$ embara : chr "si" "si" "si" "si" ...
$ edademba: int 16 17 14 23 24 18 29 20 22 30 ...
$ nembara : int 9 13 11 13 3 5 1 7 8 2 ...
$ pap : chr "si" "si" "no" "no" ...
$ edad1pap: int 40 45 NA NA 30 33 45 NA 42 38 ...
$ vph : chr "negativo" "positivo" "positivo" "positivo" ...
Finalmente, si queremos saber el nombre de las variables que tenemos en nuestra base de datos usaríamos:
colnames(multicentric)
[1] "ident" "pais" "status" "edad" "niveledu" "fumar" "edad1sex" "regcompa" "totcompa" "ets" "co"
[12] "edinico" "edfinco" "durco" "condon" "embara" "edademba" "nembara" "pap" "edad1pap" "vph"
Antes de explicar cómo crear nuevas variables, veamos algunos aspectos básicos de R en cuanto al acceso de las variables. Supongamos que queremos calcular cualquier estadístico descriptivo de alguna de las variables o ver un resumen de ella. Para esta tarea podemos utilizar distintas funciones de R que normalmente se ejecutan como funcion()
. Dentro del paréntesis debemos indicarle cuál es la variable que queremos analizar. Para ello, utilizaremos el símbolo $
[también podría usarse [[ ]]
pero intentaremos evitar escribir demasiado código]. Así, por ejemplo, si queremos calcular la media de la primera relación sexual (variable edad1sex
) bastaría con ejecutar
mean(multicentric$edad1sex, na.rm=TRUE)
[1] 19.72932
NOTA: na.rm=TRUE debe escribirse porque si no, R devuelve NA cuando hay missings en una variable. Con esta opción se analizan casos completos. También es interesante conocer estas otras funciones.
- Descriptiva de una variable categórica. Ejemplo: cuantas mujeres hay de cada país
table(multicentric$pais)
Brasil Colombia Espana Filipinas Marruecos Peru Tailandia
347 323 376 636 332 312 584
- Descriptiva de una variable continua. Ejemplo: edad de las participantes
summary(multicentric$edad)
Min. 1st Qu. Median Mean 3rd Qu. Max.
20.00 40.00 49.00 48.86 58.00 84.00
Uno de los aspectos que más cuestan al principio de usar R es familiarizarse con la escritura de código. Rstudio nos ayuda puesto que podemos autocompletar el nombre de una base de datos o de una función. Por ejemplo, basta con empezar a escribir “multi” y dar al tabulador para que en el script se autocomplete la palabra “multicentric”. Una vez escrito el nombre de la base de datos, si escribimos el símbolo $
obtenemos un desplegable que nos muestra todas las variables que hay en ese objeto y basta con seleccionar la variable que queremos resumir para que R la ponga directamente en el script tal y como muestra la siguiente figura.
También podemos acceder a una variablae usando [
e indicando el número de columna donde está la variable que queremos resumir o su nombre. En este caso como edad1sex
está en la columna 7 escribiríamos
mean(multicentric[ , 7], na.rm=TRUE)
[1] 19.72932
o usando su nombre
mean(multicentric[ , "edad1sex"], na.rm=TRUE)
[1] 19.72932
pero como se ha indicado anteriormente, lo más sencillo es usar $
ya que ayuda a evitar errores en la escritura que es uno de los principales problemas para principiantes.
3.2 Creación de variables
Para crear una nueva variable, por ejemplo la edad de la primera relación sexual menos 18, tendríamos que escribir
$edad1sex2 <- multicentric$edad1sex - 18 multicentric
Donde a la izquierda de <-
se pone el nombre de la nueva variable que queremos añadir a multicentric
(por eso se pone el $
) y a la derecha la operación que queremos hacer. NOTA: el símbolo <-
es como un =
pero este último se usa para los argumentos de una función (lo veremos más adelante).
Esta forma de escribir es muy larga y complicada, sobre todo para los nuevos usuarios de R, y puede introducir errores fácilmente. Es por ello que podemos trabajar con una serie de librerías que facilitan llevar a cabo estas operaciones. Estas liberías forman parte de los desarrolladores de RStudio y son un compendio de funciones para el análisis científico de datos (Data Science). Si queremos usar estas funciones, debemos instalar las librerías de tydiverse [https://www.tidyverse.org/] ejecutando:
install.packages(tidyverse)
Después debemos cargar estas librerías con
library(tidyverse)
Ahora, para crear una nueva variable basta con usar la función mutate()
que tiene el primer argumento el nombre de nuestra base datos y luego la fórmula que queremos aplicar para calcular la nueva variable. Nos fijamos que ya no es necesario el uso de $
y la instrucción se lee de forma más intuitiva.
<- mutate(multicentric, edad1sex2 = edad1sex - 18) multicentric
Si ahora damos un vistazo a las variables que hay en multicentric
veremos que al final se ha añadido una nueva variable (edad1sex2
) que es la que hemos creado
str(multicentric)
'data.frame': 2910 obs. of 22 variables:
$ ident : int 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 ...
$ pais : chr "Brasil" "Brasil" "Brasil" "Brasil" ...
$ status : chr "Control" "Caso" "Control" "Caso" ...
$ edad : int 64 51 48 49 41 45 51 42 58 76 ...
$ niveledu : chr "primaria" "primaria" "ninguno" "ninguno" ...
$ fumar : chr "ex-fumador" "fumador" "fumador" "no fumador" ...
$ edad1sex : int 16 17 14 23 23 18 29 19 22 27 ...
$ regcompa : int 2 1 2 1 1 1 1 2 1 1 ...
$ totcompa : chr "2-3" "1" "2-3" "1" ...
$ ets : chr "si" "si" "no" "no" ...
$ co : chr "no" "no" "no" "no" ...
$ edinico : int NA NA NA NA NA 22 30 32 NA NA ...
$ edfinco : int NA NA NA NA NA 38 38 32 NA NA ...
$ durco : int NA NA NA NA NA 14 8 1 NA NA ...
$ condon : chr "no" "no" "no" "no" ...
$ embara : chr "si" "si" "si" "si" ...
$ edademba : int 16 17 14 23 24 18 29 20 22 30 ...
$ nembara : int 9 13 11 13 3 5 1 7 8 2 ...
$ pap : chr "si" "si" "no" "no" ...
$ edad1pap : int 40 45 NA NA 30 33 45 NA 42 38 ...
$ vph : chr "negativo" "positivo" "positivo" "positivo" ...
$ edad1sex2: num -2 -1 -4 5 5 0 11 1 4 9 ...
3.3 Recodificación de variables
En biomedicina a veces interesa recodificar nuevas variables según varios criterios. Veamos algunos ejemplos
- Recodificar una variable continua en una categórica que toma valores superiores o inferiores a un valor. Ejemplo: edad de primera relación sexual antes o despues de 18 años
<- mutate(multicentric, edad1sex3 = ifelse(edad1sex <=18, 0 , 1))
multicentric table(multicentric$edad1sex3)
0 1
1379 1510
- Recodificar una variable continua en cuartiles. Ejemplo: edad de primera relación sexual en cuartiles
<- mutate(multicentric, edad1sex4 = cut(edad1sex, quantile(edad1sex, na.rm=TRUE)))
multicentric table(multicentric$edad1sex4)
(5,16] (16,19] (19,22] (22,52]
736 872 596 684
- Recodificar una variable según unos puntos de corte y ponerles una etiqueta. Ejemplo: edad de primera relación sexual antes de los 14, entre los 15 y 18 (ambos incluidos) y más de los 18 (19 o más)
<- mutate(multicentric, edad1sex5 = cut(edad1sex, c(-Inf, 14, 18, Inf),
multicentric labels=c("<14", "15-18", "19+")))
table(multicentric$edad1sex5)
<14 15-18 19+
257 1122 1510
- Recodificar una variable con ciertas categorías en otras. Ejemplo: no-fumadoras y ex-fumadoras en una categoría ‘No’ y fumadoras en ‘Si’
<- mutate(multicentric,
multicentric fumarNewCat = recode(fumar,
"no fumador" = "No",
"ex-fumador" = "No",
"fumador" = "Si"))
table(multicentric$fumar)
ex-fumador fumador no fumador
223 292 2395
table(multicentric$fumarNewCat)
No Si
2618 292
3.4 Filtrado de datos
También podemos filtrar una base de datos para hacer unos análisis específicos en un subgrupo de individuos. Supongamos que queremos describir nuestros controles. Para ello utilizaremos la función filter()
. Sabemos que el estado Caso/Control se encuentra en la variable status
por eso escribimos
<- filter(multicentric, status=="Control")
controles dim(controles)
[1] 1421 26
Usamos ==
para poner una condición de igualdad. Para otras condiciones deberemos usar
Por ejemplo, si queremos seleccionar a los casos que hayan tenido una infección por VPH (variable vph)
deberíamos escribir
<- filter(multicentric, status=="Caso" & vph=="positivo")
casos.vph dim(casos.vph)
[1] 1190 26