Autor: Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)
En este tutorial veremos unas breves notas para empezar a manejar R. Entre otros temas aprenderemos a fijar nuestro directorio de trabajo, a leer nuestros datos, a transformar variables en factores, a añadir nuevas variables, a crear algún gráfico sencillo, etc. SOn muchas cosas las que se pueden hacer en R, poco a poco se tienen que ir aprendiendo las que vayamos a utilizar, saberlo todo es muy muy complicado.
Para fijar un directorio de trabajo lo hacemos mediante el comando setwd y para conocer el directorio de trabajo en el que estamos actualmente lo hacemos por medio del comando getwd:
setwd(dir = "F:/R/MARKDOWN/BasicR/")#Aquí ponemos la dirección en la que se encuentran nuestros datos en el disco duro
getwd ()
## [1] "F:/R/MARKDOWN/BasicR"
Si tenemos nuestra matriz de datos en Excel y la copiamos con ctrl+C, la podemos leer directamente desde el portapapeles, de la siguiente forma:
mis.datos <- read.table("clipboard")
Si tenemos los datos en un fichero en el disco duro, entonces:
mis.datos<-read.table(file="prueba.csv")
mis.datos
## V1
## 1 time;Dose;activity
## 2 24;0;24
## 3 24;1;25.4
## 4 24;2;56
## 5 24;3;25
## 6 24;4;24
## 7 24;5;89
## 8 24;6;78
## 9 24;7;89
## 10 24;8;99
## 11 48;0;55
## 12 48;1;89
## 13 48;2;80
## 14 48;3;99
## 15 48;4;101
## 16 48;5;102
## 17 48;6;100
## 18 48;7;115
## 19 48;8;110
## 20 72;0;24
## 21 72;1;89
## 22 72;2;100
## 23 72;3;102
## 24 72;4;101
## 25 72;5;104
## 26 72;6;105
## 27 72;7;120
## 28 72;8;115
Fijaros que nuestros datos están en un fichero .csv. Podrían también estar en Excel o en txt.
Para conocer la estructura de nuestros datos utilizamos el comando str. También podemos ver solamente las primeras filas de nuestros datos por medio del comando head:
str(mis.datos)
## 'data.frame': 28 obs. of 1 variable:
## $ V1: chr "time;Dose;activity" "24;0;24" "24;1;25.4" "24;2;56" ...
head(mis.datos)#en las hojas excel las celdillas vacias mejor con "na"#
## V1
## 1 time;Dose;activity
## 2 24;0;24
## 3 24;1;25.4
## 4 24;2;56
## 5 24;3;25
## 6 24;4;24
De momento no tiene el aspecto deseado, es decir cada una de las columnas debe ser una variable. Aquí os podéis fijar en que nuestras variables son tomadas por R como caracteres (de esta manera no podríamos operar con ellas, por ejemplo no podríamos hacer una media).
Ahora hay que decirle a R como es la estructura de nuestro dataframe. Los datos se encuentran separados por ; en este caso se lo indicamos con sep=";". Si tenemos problemas con los decimales en este caso indicariamos dec=".", le decimos que el encabezado es el nombre de las variables con header:
mis.datos2 <- read.table(file="prueba.csv", sep = ";", dec=".", header=TRUE)
str(mis.datos2)
## 'data.frame': 27 obs. of 3 variables:
## $ time : int 24 24 24 24 24 24 24 24 24 48 ...
## $ Dose : int 0 1 2 3 4 5 6 7 8 0 ...
## $ activity: num 24 25.4 56 25 24 89 78 89 99 55 ...
Ahora ya son variables cuantitativas. Leamos las variables y el nombre de las columnas:
dimnames(mis.datos2)
## [[1]]
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15"
## [16] "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27"
##
## [[2]]
## [1] "time" "Dose" "activity"
colnames(mis.datos2)
## [1] "time" "Dose" "activity"
Fijaros ahora que nuestro dataframe es como quereremos, es decir cada columna es una variable y estas son de diferente naturaleza (numéricas, caracteres, etc.):
mis.datos2
## time Dose activity
## 1 24 0 24.0
## 2 24 1 25.4
## 3 24 2 56.0
## 4 24 3 25.0
## 5 24 4 24.0
## 6 24 5 89.0
## 7 24 6 78.0
## 8 24 7 89.0
## 9 24 8 99.0
## 10 48 0 55.0
## 11 48 1 89.0
## 12 48 2 80.0
## 13 48 3 99.0
## 14 48 4 101.0
## 15 48 5 102.0
## 16 48 6 100.0
## 17 48 7 115.0
## 18 48 8 110.0
## 19 72 0 24.0
## 20 72 1 89.0
## 21 72 2 100.0
## 22 72 3 102.0
## 23 72 4 101.0
## 24 72 5 104.0
## 25 72 6 105.0
## 26 72 7 120.0
## 27 72 8 115.0
Vamos a crear un vector que contenga varios objetos, en este caso números pares hasta el 10. Para ello utilizamos c():
pares<-c(2,4,6,8,10)
pares
## [1] 2 4 6 8 10
Si lo que queremos es un vector que contenga nombres, entonces haremos lo siguiente:
nombres<-c("Juan","María","Antonio","Soria","Barcelona")
nombres
## [1] "Juan" "María" "Antonio" "Soria" "Barcelona"
Se pueden juntar dos vectores en uno:
dos<-c(pares,nombres)
dos
## [1] "2" "4" "6" "8" "10" "Juan"
## [7] "María" "Antonio" "Soria" "Barcelona"
El orden importa:
alreves<-c(nombres,pares)
alreves
## [1] "Juan" "María" "Antonio" "Soria" "Barcelona" "2"
## [7] "4" "6" "8" "10"
En ocasiones necesitaremos transformar una variable en un factor que tendrá varios niveles. Esto es importante por ejemplo para hacer un análisis ANOVA. Para ello utilizamos el comando factor de la siguiente manera:
time<-factor(mis.datos2$time)
levels(time)
## [1] "24" "48" "72"
str(mis.datos2)
## 'data.frame': 27 obs. of 3 variables:
## $ time : int 24 24 24 24 24 24 24 24 24 48 ...
## $ Dose : int 0 1 2 3 4 5 6 7 8 0 ...
## $ activity: num 24 25.4 56 25 24 89 78 89 99 55 ...
En este caso el objeto time contiene los nombres de los niveles del factor. En este caso el dataframe original no se ha modificado. Si lo que queremos es que el dataframe original contenga el time como factor tendremos que hacer lo siguiente:
mis.datos2$time<-as.factor(mis.datos2$time)
str(mis.datos2)
## 'data.frame': 27 obs. of 3 variables:
## $ time : Factor w/ 3 levels "24","48","72": 1 1 1 1 1 1 1 1 1 2 ...
## $ Dose : int 0 1 2 3 4 5 6 7 8 0 ...
## $ activity: num 24 25.4 56 25 24 89 78 89 99 55 ...
Vemos como el time es ahora un factor con tres niveles. Para conseguirlo hay que utilizar as.factor indicando que variable queremos que se transforme en un factor. Comprobar al terminar con el comando str que efectivamente R ha hecho lo que queriamos que hiciera.
Se pueden instalar facilmente con el menu de RStudio. En cualquier caso los comandos son install.packages y se activan por medio de library. Una vez instalado un paquete en el ordenador no es necesario volver a instalarlo. Cuando se inicia una nueva sesión y se va a utilizar el paquete es necesario activarlo por medio de library:
install.packages("ROCR", dependencies=TRUE) library(ROCR)
Ahora nos interesa introducir una nueva variable, que se llamará letra y que contendrá el nombre de A y B. Para ello podemos operar de la siguiente manera.
mis.datos2$letra <- c("A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B")
mis.datos2
## time Dose activity letra
## 1 24 0 24.0 A
## 2 24 1 25.4 A
## 3 24 2 56.0 A
## 4 24 3 25.0 A
## 5 24 4 24.0 A
## 6 24 5 89.0 A
## 7 24 6 78.0 A
## 8 24 7 89.0 A
## 9 24 8 99.0 A
## 10 48 0 55.0 B
## 11 48 1 89.0 B
## 12 48 2 80.0 B
## 13 48 3 99.0 B
## 14 48 4 101.0 B
## 15 48 5 102.0 B
## 16 48 6 100.0 B
## 17 48 7 115.0 B
## 18 48 8 110.0 B
## 19 72 0 24.0 B
## 20 72 1 89.0 B
## 21 72 2 100.0 B
## 22 72 3 102.0 B
## 23 72 4 101.0 B
## 24 72 5 104.0 B
## 25 72 6 105.0 B
## 26 72 7 120.0 B
## 27 72 8 115.0 B
Si la variable es numérica podemos hacerlo de la siguiente forma:
numero<-c(1, 2, 4, 2, 3, 45, 22, 2, 0, 33, 32, 3, 2, 2, 2, 4, 7, 8, 8, 8, 8, 8, 9, 99, 9, 4, 4)
mis.datos2$numero <- numero
mis.datos2
## time Dose activity letra numero
## 1 24 0 24.0 A 1
## 2 24 1 25.4 A 2
## 3 24 2 56.0 A 4
## 4 24 3 25.0 A 2
## 5 24 4 24.0 A 3
## 6 24 5 89.0 A 45
## 7 24 6 78.0 A 22
## 8 24 7 89.0 A 2
## 9 24 8 99.0 A 0
## 10 48 0 55.0 B 33
## 11 48 1 89.0 B 32
## 12 48 2 80.0 B 3
## 13 48 3 99.0 B 2
## 14 48 4 101.0 B 2
## 15 48 5 102.0 B 2
## 16 48 6 100.0 B 4
## 17 48 7 115.0 B 7
## 18 48 8 110.0 B 8
## 19 72 0 24.0 B 8
## 20 72 1 89.0 B 8
## 21 72 2 100.0 B 8
## 22 72 3 102.0 B 8
## 23 72 4 101.0 B 9
## 24 72 5 104.0 B 99
## 25 72 6 105.0 B 9
## 26 72 7 120.0 B 4
## 27 72 8 115.0 B 4
Lo anterior es una forma adecuada si tenemos pocos datos, de lo contrario podemos cometer errores. Si queremos numerar nuestras observaciones lo podemos hacer del siguiente modo:
vectorsinnada <- c()
for(i in 1:27) {
vectorsinnada[i] <- i
}
vectorsinnada
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27
mis.datos2$orden <- vectorsinnada
mis.datos2
## time Dose activity letra numero orden
## 1 24 0 24.0 A 1 1
## 2 24 1 25.4 A 2 2
## 3 24 2 56.0 A 4 3
## 4 24 3 25.0 A 2 4
## 5 24 4 24.0 A 3 5
## 6 24 5 89.0 A 45 6
## 7 24 6 78.0 A 22 7
## 8 24 7 89.0 A 2 8
## 9 24 8 99.0 A 0 9
## 10 48 0 55.0 B 33 10
## 11 48 1 89.0 B 32 11
## 12 48 2 80.0 B 3 12
## 13 48 3 99.0 B 2 13
## 14 48 4 101.0 B 2 14
## 15 48 5 102.0 B 2 15
## 16 48 6 100.0 B 4 16
## 17 48 7 115.0 B 7 17
## 18 48 8 110.0 B 8 18
## 19 72 0 24.0 B 8 19
## 20 72 1 89.0 B 8 20
## 21 72 2 100.0 B 8 21
## 22 72 3 102.0 B 8 22
## 23 72 4 101.0 B 9 23
## 24 72 5 104.0 B 99 24
## 25 72 6 105.0 B 9 25
## 26 72 7 120.0 B 4 26
## 27 72 8 115.0 B 4 27
Ahora vamos a incluir una nueva variable calculada a partir de las variables que ya tenemos en nuestro dataframe. En este caso incluiremos una nueva variable que será la suma de Dose y numero:
calculada<-rowSums(mis.datos2[ , c("Dose", "numero")])
calculada
## [1] 1 3 6 5 7 50 28 9 8 33 33 5 5 6 7 10 14 16 8
## [20] 9 10 11 13 104 15 11 12
mis.datos2$calculada <- calculada
mis.datos2
## time Dose activity letra numero orden calculada
## 1 24 0 24.0 A 1 1 1
## 2 24 1 25.4 A 2 2 3
## 3 24 2 56.0 A 4 3 6
## 4 24 3 25.0 A 2 4 5
## 5 24 4 24.0 A 3 5 7
## 6 24 5 89.0 A 45 6 50
## 7 24 6 78.0 A 22 7 28
## 8 24 7 89.0 A 2 8 9
## 9 24 8 99.0 A 0 9 8
## 10 48 0 55.0 B 33 10 33
## 11 48 1 89.0 B 32 11 33
## 12 48 2 80.0 B 3 12 5
## 13 48 3 99.0 B 2 13 5
## 14 48 4 101.0 B 2 14 6
## 15 48 5 102.0 B 2 15 7
## 16 48 6 100.0 B 4 16 10
## 17 48 7 115.0 B 7 17 14
## 18 48 8 110.0 B 8 18 16
## 19 72 0 24.0 B 8 19 8
## 20 72 1 89.0 B 8 20 9
## 21 72 2 100.0 B 8 21 10
## 22 72 3 102.0 B 8 22 11
## 23 72 4 101.0 B 9 23 13
## 24 72 5 104.0 B 99 24 104
## 25 72 6 105.0 B 9 25 15
## 26 72 7 120.0 B 4 26 11
## 27 72 8 115.0 B 4 27 12
Pondremos una serie de condiciones que tienen que cumplir la variable numero para generar los nombres de la nueva variable llamada condicionada:
mis.datos2$condicionada <- as.factor(ifelse(mis.datos2$numero < 1, 'A',
ifelse(mis.datos2$numero <2 , 'B',
ifelse(mis.datos2$numero <3, 'C',
ifelse(mis.datos2$numero <100, 'D')))))
mis.datos2
## time Dose activity letra numero orden calculada condicionada
## 1 24 0 24.0 A 1 1 1 B
## 2 24 1 25.4 A 2 2 3 C
## 3 24 2 56.0 A 4 3 6 D
## 4 24 3 25.0 A 2 4 5 C
## 5 24 4 24.0 A 3 5 7 D
## 6 24 5 89.0 A 45 6 50 D
## 7 24 6 78.0 A 22 7 28 D
## 8 24 7 89.0 A 2 8 9 C
## 9 24 8 99.0 A 0 9 8 A
## 10 48 0 55.0 B 33 10 33 D
## 11 48 1 89.0 B 32 11 33 D
## 12 48 2 80.0 B 3 12 5 D
## 13 48 3 99.0 B 2 13 5 C
## 14 48 4 101.0 B 2 14 6 C
## 15 48 5 102.0 B 2 15 7 C
## 16 48 6 100.0 B 4 16 10 D
## 17 48 7 115.0 B 7 17 14 D
## 18 48 8 110.0 B 8 18 16 D
## 19 72 0 24.0 B 8 19 8 D
## 20 72 1 89.0 B 8 20 9 D
## 21 72 2 100.0 B 8 21 10 D
## 22 72 3 102.0 B 8 22 11 D
## 23 72 4 101.0 B 9 23 13 D
## 24 72 5 104.0 B 99 24 104 D
## 25 72 6 105.0 B 9 25 15 D
## 26 72 7 120.0 B 4 26 11 D
## 27 72 8 115.0 B 4 27 12 D
Nos ha incluido una nueva variable llamada condicionada que es un factor con cuatro niveles. Comprobamos esa información:
str(mis.datos2)
## 'data.frame': 27 obs. of 8 variables:
## $ time : Factor w/ 3 levels "24","48","72": 1 1 1 1 1 1 1 1 1 2 ...
## $ Dose : int 0 1 2 3 4 5 6 7 8 0 ...
## $ activity : num 24 25.4 56 25 24 89 78 89 99 55 ...
## $ letra : chr "A" "A" "A" "A" ...
## $ numero : num 1 2 4 2 3 45 22 2 0 33 ...
## $ orden : int 1 2 3 4 5 6 7 8 9 10 ...
## $ calculada : num 1 3 6 5 7 50 28 9 8 33 ...
## $ condicionada: Factor w/ 4 levels "A","B","C","D": 2 3 4 3 4 4 4 3 1 4 ...
Con la orden colnames podemos renombrar los nombres de las variables de nuestro dataframe. En este caso las vamos a poner todas las variables en español y en minúsculas evitando los acentos.
colnames(mis.datos2) <- c('tiempo', 'dosis', 'actividad', 'letra','numero','calculada','condicionada')
str(mis.datos2)
## 'data.frame': 27 obs. of 8 variables:
## $ tiempo : Factor w/ 3 levels "24","48","72": 1 1 1 1 1 1 1 1 1 2 ...
## $ dosis : int 0 1 2 3 4 5 6 7 8 0 ...
## $ actividad : num 24 25.4 56 25 24 89 78 89 99 55 ...
## $ letra : chr "A" "A" "A" "A" ...
## $ numero : num 1 2 4 2 3 45 22 2 0 33 ...
## $ calculada : int 1 2 3 4 5 6 7 8 9 10 ...
## $ condicionada: num 1 3 6 5 7 50 28 9 8 33 ...
## $ NA : Factor w/ 4 levels "A","B","C","D": 2 3 4 3 4 4 4 3 1 4 ...
Vamos a calcular la media y mediana de la variable numero. En este caso no tenemos NA en nuestra matriz, no sería necesario incluir na.rm:
mean(mis.datos2$numero,na.rm = FALSE)
## [1] 12.25926
median(mis.datos2$numero,na.rm = FALSE)
## [1] 4
Un boxplot con la variable numero:
boxplot(mis.datos2$numero)
Un boxplot con la variable numero en función de la variable condicionada:
boxplot(numero~condicionada, data = mis.datos2)
Un histograma de numero frente a Dose:
hist(mis.datos2$numero)
Un gráfico de barras de numero frente a Dose:
barplot(mis.datos2$numero,names.arg=mis.datos2$Dose)
Espero que sea de utilidad.
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)