R es un lenguaje de programación orientado al análisis estadístico. Como todo lenguaje tiene sus particularidades. A continuación vamos a ver algunos aspectos básicos de dicho lenguaje que nos permitirá avanzar con las funciones que vamos a usar para analizar datos.
Las operaciones matemáticas básicas se realizan usando los símbolos
convencionales: suma (+), resta (-), división
(/), producto (*) y potencia
(^)
Por ejemplo, \(1 + \left( 3 \times 4 + \dfrac{5 -2}{3} \right)^2\) en R es:
1 + (3 * 4 + (5 - 2)/3)^2
[1] 170
También se pueden evaluar expresiones lógicas: igual
(==), distinto (!=), mayor que
(>), menor que (<), mayor o igual que
(>=), menor o igual que (<=). El
resultado es TRUE (verdadero) o FALSE
(falso).
Por ejemplo, podemos evaluar si 3 es igual 4
3 == 4
[1] FALSE
O si 5 es mayor o igual a 3
5 >= 3
[1] TRUE
También se pueden combinar con los operadores intersección
(&), unión (|) y
negación (!).
Por ejemplo, evaluar si se cumplen las dos cosas anteriores a la vez
3 == 4 & 5 >= 3
[1] FALSE
Devuelve FALSE porque 3 == 4 no es
verdadero. Si reemplazamos & por | va a
devolver evaluar si una de las dos se cumple:
3 == 4 | 5 >= 3
[1] TRUE
Tambien se pueden combinar con operaciones matemáticas…
4 * 2 == 8
[1] TRUE
En este caso primero evalúa 4 * 2 y luego compara el
resultado con 8
Un objeto es un espacio de la memoria que almacena un pedazo de información (una cifra, un conjunto de números, el resultado de un análisis, etc). También se denomina variables ya que su contenido puede cambiar. En R prácticamente todo puede representarse como un objeto.
Los objetos o variables se crean asignandoles informacicon
(números, letras, resultados de operaciones, etc), con el símbolo
<- (ALT + -) o =. Esta
informacion se puede recuperar, modificar o utilizar para otros
cálculos.
Supongamos que queremos asignar el valor 2 a la variable
x.
x <- 2
En la consola vuelve a aparecer el simbolo > y nada
más. En el ambiente se ve una entrada que dice x y el
valor. Podemos recuperar el valor en la consola tipeando el nombre del
objeto:
x
[1] 2
Tambien podemos reusarlo en otro calculo, por ejemplo obtener 2 veces
x.
2 * x
[1] 4
O bien obtener una nueva variable
y <- 2 * x +1
y
[1] 5
Aclaración
:
los nombres de las variables no deben empezar con números ni contener
espacios. No pueden usarse operadores (*+-/&%) en los
nombres pero puede usarse . o _.
# Mal
2x <- 3
mi variable <- 3
# Bien
x_2 <- 3
x.2 <- 3
x2 <- 3También R es sensibles a mayúsculas
# Definir 'A' y 'a'
A <- 3
a <- 5
# Verificar si 'A' y 'a' son lo mismo
A == a
[1] FALSE
Son los objetos más simples a partir de los cuales se construyen
otros tipos de objetos. Se crean utilizando la función c()
(combine) para “combinar” datos del mismo
tipo
x <- c(13, 45, 67, 45)
x
[1] 13 45 67 45
En el caso de mezclar de datos, R los va a convertir al tipo de datos más simple.
Por ejemplo: si queremos crear un vector con 3 valores: lógico, numérico y texto, R va a asumir que todos los elementos son de tipo texto
y <- c(TRUE, 34, "hola")
y
[1] "TRUE" "34"   "hola"
Los vectores están indexados. Se puede acceder a sus elementos usando
el operador [ ] e indicando el número de orden.
Por ejemplo: para recuperar el 3er elemento del vector
x
y[3]
[1] "hola"
Veremos más adelante los distintos tipos.
Para crear los vectores utilizamos una funcion c(). Las
funciones dentro de R tienen la siguiente forma
nombre_funcion(arg1, arg2, ...)
donde arg son los argumentos (valores de entrada u
opciones). Algunos argumentos toman valores por defecto otros hay que
declararlos.
Por ejemplo, la función round()` tiene los
argumentos:
x, para pasar el número o vector numérico que queremos
redondeardigits = 0 para indicar el numero de dígitos a usar,
por defecto 0.Supongamos que queremos redondear el numero 3.141593 a 3
dígitos.
# Indicando los argumentos
round(x = 3.141593, digits = 3)
[1] 3.142
# Sin indicar los argumentos
round(3.141593, 3)
[1] 3.142
En este último caso, el orden de los argumentos es clave ya que R asigna los valores en función de la posición.
# Sin indicar los argumentos
round(3, 3.141593)
[1] 3
Devuelve 3 por considera que queremos redondear el
número 3
numeric)Números racionales (enteros o con coma).
Los números enteros se tratan como numeric a menos que
se los convierta con as.integer().
y <- as.integer(x)
class(y)
[1] "integer"
Los datos numéricos permiten todas las operaciones algebráicas
character)Cadenas de texto o número delimitadas por comillas (simples o dobles, nom mezclar).
Lógicamente no se pueden realizar operaciones numéricas.
R avisa y devuelve NA
mean(x)
[1] NA
logic)Condición verdadero (TRUE o T) o falso
(FALSE o F)
logico <- c(T, F, T, TRUE, FALSE, F)
logico
[1]  TRUE FALSE  TRUE  TRUE FALSE FALSE
Otro ejemplo: ¿cuáles de los siguientes números son mayores a 30?
x <- c(23, 43, 21, 34, 56, 3, 23, 3)
x > 30
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE
Los valores faltantes se simbolizan en R con
NA (not available). Indican que debería haber un
valor pero que está faltando.
A diferencia del NA, un valor de tipo NULL
indica que no hay información y que tampoco se esperaba que la haya.
x <- c(1, 2, 3, NULL, 4)
x
[1] 1 2 3 4
Algunas operaciones matemáticas devuelven valores NaN
(not a number) cuando no están definidas, por ejemplo:
0/0
[1] NaN
O bien valores infinitos (Inf):
1/0
[1] Inf
matrix)Colección de vectores de igual longitud y mismo tipo de
datos. Se crea con la función matrix(), o combinando
filas o columnas de igual longitud con rbind() o
cbind().
Por ejemplo la matriz:
\[ \mathbf{M} = \left[\begin{array}{c c} 1 & 2 \\ 3 & 4 \\ 5 & 6 \\ \end{array} \right] \] en R se representa así:
Se puede indexar usando [n, p] donde n es
el numero de fila y p numero de columna. Por ejemplo para
obtener el elemento \(m_{12}\)
M[1,2]
[1] 4
O todos los elementos de la columna 2
M[, 2]
[1] 4 5 6
list)Es una generalización de los vectores ya que los elementos pueden ser de igual o diferente tipo de datos
lst <- list(23, "hola", TRUE)
lst
[[1]]
[1] 23
[[2]]
[1] "hola"
[[3]]
[1] TRUE
Se pueden indexar usando [[ ]]
# El segundo elemento de l
lst[[2]]
[1] "hola"
Cada elemento a su vez puede ser cualquier objeto de los vistos anteriormente.
data.frame)Similares a las matrices pero cada columna puede ser de un tipo de dato diferente. Útil para guardar datos donde cada fila es un caso y cada columna una variable.
Supongamos que tenemos la tabla de datos:
| Lote | Variedad | Rendimiento | 
|---|---|---|
| 1 | Escorpion | 34 | 
| 2 | Escorpion | 36 | 
| 3 | Yarara | 40 | 
| 4 | Baguette11 | 28 | 
| 5 | Tijetera | 31 | 
En R podemos representarla así:
trigo <- data.frame(
  lote = 1:5,
  variedad = c('Escorpion', 'Escorpion', 'Yarara', 'Baguette 11', 'Tijetera'),
  rendimiento = c(34, 36, 40, 28, 31)
)
trigo
  lote    variedad rendimiento
1    1   Escorpion          34
2    2   Escorpion          36
3    3      Yarara          40
4    4 Baguette 11          28
5    5    Tijetera          31
Al igual que las matrices, un data.frame se puede
indexar con [ ]. Por ejemplo, si quisieramos El bombre de
la varidedad de la fila 2
trigo[2, 3]
[1] 36
O todos los nombres de la fila 2
trigo[2, ]
  lote  variedad rendimiento
2    2 Escorpion          36
Tambien podemos hacer consultas más específicas: “Lotes con rendimiento mayor a 35 qq/ha”
trigo[trigo$rendimiento > 35, ]
  lote  variedad rendimiento
2    2 Escorpion          36
3    3    Yarara          40
Las variables o columnas se pueden acceder individualmente usando o
el operador $ seguido dle nombre de la columna o
[, "nombre"], o [, posicion]. Ejemplo: extraer
la columna rendimiento que es la número 3
trigo$rendimiento
[1] 34 36 40 28 31
trigo[, "rendimiento"]
[1] 34 36 40 28 31
trigo[, 3]
[1] 34 36 40 28 31
factor y
ordered)Si los elementos de vector de tipo texto (character) y
representan niveles nominales (categorías), el objeto puede convertirse
a factor de modo tal que los valores son reemplazados por
un número que se asocia a los niveles del factor (ordenados
alfabeticamente, a menos que se indique otra cosa).
Un ejemplo de un vector tipo character.
x <- c('bajo', 'medio', 'alto', 'alto', 'bajo', 'bajo')
x
[1] "bajo"  "medio" "alto"  "alto"  "bajo"  "bajo" 
Sólo se muestran los valores (bajo, medio y
alto). No hay información de niveles. Ahora si aplicamos
factor(x):
y <- factor(x)
y
[1] bajo  medio alto  alto  bajo  bajo 
Levels: alto bajo medio
Los valores pasaron al atributo levels y los datos
fueron reemplazados por los identificadores 2,
3, y 1 según el orden alfabético de los
niveles.
as.numeric(y)
[1] 2 3 1 1 2 2
Cuando los niveles tienen una jerarquía u orden, se puede especificar
este tipo de relación mediante as.ordered() que convierte
el factor en uno especial ordered agregando la
relación entre los niveles
z <- factor(x, levels = c('bajo', 'medio', 'alto'))
z <- as.ordered(z)
z
[1] bajo  medio alto  alto  bajo  bajo 
Levels: bajo < medio < alto
Los factores como cualquier vector tambien se indexan con
[ ].