Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1 Primeros pasos
Res un lenguaje y entorno de programación, creado en 1993 por Ross Ihaka y Robert Gen-
tleman del Departamento de Estadística de la Universidad de Auckland, cuya característica
principal es que forma un entorno de análisis estadístico para la manipulación de datos, su
cálculo y la creación de gráficos.
En su aspectoRpuede considerarse como otra implementación del lenguaje de programación
S, con la particularidad de que es un software GNU, General Public Licence (conjunto de
programas desarrollados por la Free Software Foundation), es decir, de uso libre. La página
principal del proyecto R-project es https://www.r-project.org, en ella podremos conseguir
gratuitamente el programa en su última versión además de manuales, bibliotecas o paquetes
y demás elementos que forman la gran familia que es R.
getwd()
[1] "/lava/soft/R"
[1] 4
1
1.1 Conceptos iniciales RPractico 1 PRIMEROS PASOS
R es un lenguaje funcional, esto es, realiza las tareas a través de funciones. La primera función
que necesitamos conocer es la que nos proporciona la ayuda del programa, esta es help.
help(mean)
?mean
??ramdom
example(cumsum)
cumsum> cumsum(1:10)
[1] 1 3 6 10 15 21 28 36 45 55
cumsum> cumprod(1:10)
[1] 1 2 6 24 120 720 5040 40320 362880
[10] 3628800
1.1.3 Asignaciones
Al igual que ocurre con otros lenguajes de programación, R asigna nombres a las expresiones.
Esto lo conseguiremos mediante los símbolos: <−, −> o =.
En el caso que necesitemos poner notaciones o comentarios en R, estos se realizan poniendo
delante del comentario el símbolo #.
base <- 12
altura = 5
#Determina el area
[1] 30
1.1.4 Paquetes
1.1.5 Funciones ls y rm
ls()
rm(base)
ls()
rm(list=ls())
ls()
character(0)
La función library gestiona la biblioteca, dando información sobre los existentes y cargándolos
en memoria o descargándolos de la misma.
R puede utilizarse como una calculadora, ya que es capaz de manejar todas las operaciones
elementales:
Operación Símbolo
Suma +
Diferencia -
Producto *
División /
Potencia ^
División entera %/%
Resto %%
2 + 3
[1] 5
7 - 9
[1] -2
5 * 4
[1] 20
3 / 5
[1] 0.6
9 %/% 4
[1] 2
9 %% 4
[1] 1
(2+3i)+(3+1i)
[1] 5+4i
(2+4i)-(3+4i)
[1] -1+0i
(2+3i)*(3+4i)
[1] -6+17i
(2+3i)/(3+4i)
[1] 0.72+0.04i
(2+4i)^3
[1] -88-16i
4 < 5
[1] TRUE
4 <= 5
[1] TRUE
4 > 5
[1] FALSE
4 >= 5
[1] FALSE
4 == 5
[1] FALSE
4 != 5
[1] TRUE
A <- c(TRUE,TRUE,FALSE,FALSE)
B <- c(TRUE,FALSE,TRUE,FALSE)
A & B
A | B
xor(A,B)
x <- 1:5
y <- c(2,4,3,6,5)
x[x<y]
[1] 1 2 4
y[y>x]
[1] 2 4 6
2 Manipulación de datos
1:10
[1] 1 2 3 4 5 6 7 8 9 10
7:-4
[1] 7 6 5 4 3 2 1 0 -1 -2 -3 -4
c(5,10,32,40)
[1] 5 10 32 40
c(1:5,8,10,12)
[1] 1 2 3 4 5 8 10 12
seq(1,10,2)
[1] 1 3 5 7 9
seq(1,4,0.2)
[1] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0
seq(1,2,length=9)
[1] 1.000 1.125 1.250 1.375 1.500 1.625 1.750 1.875 2.000
rep(2,5)
[1] 2 2 2 2 2
rep(1:4,3)
[1] 1 2 3 4 1 2 3 4 1 2 3 4
rep(1:3,rep(4,3))
[1] 1 1 1 1 2 2 2 2 3 3 3 3
rep(1:4,1:4)
[1] 1 2 2 3 3 3 4 4 4 4
La función sequence() crea una secuencias de enteros. Cada secuencia terminará en el número
especificado como argumento.
sequence(c(3,4,6))
[1] 1 2 3 1 2 3 4 1 2 3 4 5 6
La función expand.grid() crea un data frame con todas las combinaciones posibles de los
elementos de los vectores o factores que proporcionemos como argumentos.
x <- 1:7
x
[1] 1 2 3 4 5 6 7
Para obtener o cambiar el modo (tipo) de los elementos de un vector se utiliza la función
mode. Los tipos son: logical, numeric, complex, character, null, list, function,
graphics, expression, name, frame, raw y unknown.
x <- seq(1,5,2)
mode(x)
[1] "numeric"
x <- 1:5
y <- 2:6
x+y
[1] 3 5 7 9 11
x-y
[1] -1 -1 -1 -1 -1
x*y
[1] 2 6 12 20 30
x/y
x^2
[1] 1 4 9 16 25
x^y
x <- 4
length(x)
[1] 1
length(x) <- 5
x
[1] 4 NA NA NA NA
Para obtener un elemento que ocupa la posición i de un vector x usamos x[i]. Los subindices
pueden ser números naturales o valores lógicos.
x <- (1:6)^3
x
x[c(1,3,5)]
[1] 1 27 125
nombre[sexo=="Hombre"]
2.2 Factores
Un factor es un vector que sirve para manejar variables cualitativas con escalas nominal u
ordinal.
Si: M, B, B, M, A, B, B, M, M, B, M, B, B, A, M, B, M, A, M, B.
Representan los niveles socio económicos de 20 familias. Donde B es bajo, M es medio y A es
alto.
x <- c("M","B","B","M","A","B","B","M","M","B","M","B","B","A","M","B","M","A","M","B")
xf <- factor(x)
xf
[1] M B B M A B B M M B M B B A M B M A M B
Levels: A B M
class(xf)
[1] "factor"
levels(xf)
[1] Medio Bajo Bajo Medio Alto Bajo Bajo Medio Medio Bajo Medio Bajo
[13] Bajo Alto Medio Bajo Medio Alto Medio Bajo
Levels: Alto Bajo Medio
#las frecuencias
table(xf)
xf
Alto Bajo Medio
3 9 8
Si: 5 3 4 5 6 6 7 7 3 7
Representan los notas de 10 estudiantes en una escala ordinal de de 0 hasta 7.
x <- c(5,3,4,5,6,6,7,7,3,7)
xf <- ordered(x, levels=c(0,1,2,3,4,5,6,7))
xf
[1] 5 3 4 5 6 6 7 7 3 7
Levels: 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7
#Las frecuencias
table(xf)
xf
0 1 2 3 4 5 6 7
0 0 0 2 1 2 2 3
Si tenemos un vector numérico y otro categórico de la misma longitud podemos aplicar una
función de agregación.
La muestra de las edades de 20 personas:
7 22 12 40 35 12 18 33 42 35 2 20 56 17 6 35 56 45 48 12
se desea conocer el promedio de las categorías: niño si sus edades son hasta 11; adolescente si
sus edades son desde 12 y menor que 18 y adultos de 18 en adelante.
x <- c(7,22,12,40,35,12,18,33,42,35,2,20,56,17,6,35,56,45,48,12)
xcat <- ifelse(x<12,"niño",ifelse(x<18,"adolescente","adulto"))
xcat
tapply(x,xfac,length)
tapply(x,xfac,mean)
2.2.4 La función gl
[1] Hombre Hombre Hombre Hombre Hombre Hombre Mujer Mujer Mujer Mujer
[11] Mujer Mujer
Levels: Hombre Mujer
2.3 Cadenas
Las cadenas son secuencias de caracteres delimitados por “ “. Para concatenar cadenas usamos
la función paste.
paste("Hola","Mundo",sep="-")
[1] "Hola-Mundo"
paste("Columna",1:4,sep="")
2.4 Matrices
Las matrices son vectores de dos dimensiones. Para crear una matriz se utiliza la función
matrix(data=NA, nrow=1, ncol=1, byrow=FALSE, dimnames=NULL), donde los parámetros
son: data es el vector que contiene los valores que formarán la matriz, nrow es el número de
filas, ncol es el número de columnas.
matrix(1,3,4)
matrix(1:9,3)
matrix(1:8,2)
matrix(1:8,4)
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
matrix(1:8,ncol=4)
matrix(1:9,3,byrow=TRUE)
Para dar nombres a las columnas (o a las filas) usamos el parámetro dimnames.
matrix(1:9,3)
matrix(1:9,3,dimnames=list(c(),c("C1","C2","C3")))
C1 C2 C3
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
matrix(1:9,3,dimnames=list(c("F1","F2","F3"),c()))
matrix(1:9,3,dimnames=list(c("F1","F2","F3"),c("C1","C2","C3")))
C1 C2 C3
F1 1 4 7
F2 2 5 8
F3 3 6 9
Las operaciones con matrices se hacen con los operadores: + , - , %\*% para al suma, difer-
encia y producto respectivamente. La inversa de una matriz se calcula con la función solve.
Así para resolver un sistema lineal 𝐴𝑋 = 𝐵, usamos la orden X <- solve(A) %\*% B.
Para obtener las dimensiones de una matriz usamos la función dim y para determinar la
transpuesta t.
m1 <- matrix(1:9,3)
m1
m2 <- matrix(9:1,3)
m2
m1 + m2
m1 - m2
m1 %*% m2
[,1]
[1,] 3
[2,] -24
[3,] 30
dim(m1)
[1] 3 3
t(m2)
m <- matrix(1:9,3)
diag(m)
[1] 1 5 9
diag(m) <- 7
m
diag(3)
diag(c(10,20,30))
Para obtener y modificar los nombres de las filas y columnas tenemos las funciones: rownames
y colnames:
m <- matrix(1:9,3)
m
rownames(m)
NULL
colnames(m)
NULL
m <- matrix(1:9,3)
m
rownames(m)
NULL
colnames(m)
NULL
rbind(m,fila4=c(10,20,30))
cbind(m,columna4=c(10,20,30))
2.5 Arreglos
array(1:8, dim=c(2,2,2))
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
2.6 Listas
Una lista es un vector de objetos de tipos distintos. Muchas funciones de R devuelven los
resultados en forma de lista. Para crearlas se usa el comando list. Para extraer un elemento
de una lista se usa lista$nombre o un doble corchete, [[i]], con el número de orden, i, del
objeto dentro de la lista:
x <- list(nombre="Juan",num.hijos=3,edad.hijos=c(4,6,10))
x
$nombre
[1] "Juan"
$num.hijos
[1] 3
$edad.hijos
[1] 4 6 10
x$nombre
[1] "Juan"
x[[1]]
[1] "Juan"
x$num.hijos
[1] 3
x[[2]]
[1] 3
x$edad.hijos
[1] 4 6 10
x[[3]]
[1] 4 6 10
La función sapply permite aplicar una función a cada elemento de una lista y devuelve los
resultados en un vector. Luego lapply hace lo mismo pero retorna una lista:
Crear una lista que tenga tres vectores con 20 datos aleatorios y obtenga su media.
$normal
[1] 5.626693 11.803105 24.374535 6.264398 5.162227 8.660642 11.713861
[8] 13.680031 12.763635 6.088107 10.513069 9.868011 5.952453 7.921779
[15] 5.089650 17.610189 19.179036 15.639686 12.818993 6.788048
$poisson
[1] 9 12 11 8 2 8 5 10 5 13 6 7 15 10 5 11 5 12 7 5
$uniforme
[1] 9.413858 5.164494 6.452243 10.552561 14.423793 9.149134 5.540605
[8] 11.671638 8.301844 9.965121 8.395466 7.055776 7.801536 14.927626
[15] 5.767803 5.695534 8.769980 5.092954 12.342922 6.036205
sapply(datos,mean)
Las hojas de datos, data frame son estructuras constituidas por diferentes tipos de datos y son
equivalentes a las bases de datos. Las componentes deben ser vectores (numéricos, cadenas de
caracteres, o lógicos), factores, matrices numéricas, listas u otras hojas de datos. Los vectores
numéricos y los factores se incluyen sin modificar, los vectores no numéricos se fuerzan a
factores.
class(datos)
[1] "data.frame"
unclass(datos)
$Peso
[1] 90 120 56
$Altura
[1] 1.90 1.87 1.70
$Sexo
[1] "Hombre" "Hombre" "Mujer"
attr(,"row.names")
[1] 1 2 3
subset(datos,subset=c(Peso<100))
subset(datos,subset=c(Sexo=="Hombre"))
subset(datos,select=c(Peso))
Peso
1 90
2 120
3 56
transform(datos,IMC=Peso/(Altura)^2)
Para archivar una hoja de datos tenemos la función: write.table(x, file="", sep=" ",
dec=".", row.names=TRUE, col.names=TRUE) donde x puede ser una matriz o hoja de datos,
file es la ruta del archivo, sep es el carácter de separación entre los campos de cada columna,
dec es es carácter para separación decimal, row.names es un valor lógico que indica la inclusión
de esta columna o un vector con los nombres de las filas a ser incluidos en la salida, col.names
es un valor lógico que indica la inclusión de los nombres de los campos o un vector con los
nombres de las columnas a ser incluidas en la salida.
Para recuperar una hoja de datos tenemos: read.table(file, header=FALSE, sep="",
dec="." row.names, col.names, na.strings="NA", eol="\n", nrows=-1, skip=0,