In [ ]:
Sys.setlocale("LC_ALL", 'en_US.UTF-8')
In [ ]:
x = 10
x
In [ ]:
x <- 10
x
El operador = puede ser usado como instrucción a nivel del prompt o como subexpresión dentro de una lista. Eso sí, no puede ser evaluada como parámetro dentro de una función.
In [ ]:
y=10
y
{
y=20
y
}
In [ ]:
median(y = 1:10)
y
El operador <- puede ser usado como instrucción en cualquier nivel. Sí puede ser evaluado como parámetro dentro de una función.
In [ ]:
y <- 10
y
{
y <- 20
y
}
In [ ]:
median(y <- 1:10)
y
Operadores de comparación lógica
In [ ]:
10 > 5
In [ ]:
10 < 5
In [ ]:
edad = c(35, 37, 30, 45, 40, 36, 45, 32, 52, 42, 30, 48 )
edad
Una vez definido el vector, uno puedo aplicar funciones estadísiticas tales como:
mean
: Promediomedian
: Medianasd
: Desviación estándar
In [ ]:
mean(edad)
median(edad)
sd(edad)
Las variables tipo escalar y vector son útiles a la hora de analizar situaciones con pocos datos. Como iremos viendo a lo largo del curso, la mayoría de los proyectos de análsis de datos requieren usar bases de datos o tablas que contienen múltiples columnas y filas. Una manera de manipular este tipo de datos es usando matrices.
In [ ]:
region = c("Arica y Parinacota","Tarapacá","Antofagasta","Atacama","Coquimbo","Valparaíso","Metropolitana de Santiago","Libertador General Bernardo O'Higgins","Maule","Biobío","La Araucanía","Los Ríos","Los Lagos","Aisén del General Carlos Ibáñez del Campo","Magallanes y de la Antártica Chilena")
poblacion = c(308271,205566,551627,292054,714856,1859312,7150480,903248,1073635,2025995,933537,380618,835829,106893,158828)
superficie = c(17446.20,41632.60,126048.80,74806.30,40967.80,12646.28,15547.00,16583.30,30340.30,37068.70,31842.30,18577.60,48583.30,107449.40,1392783.70)
In [ ]:
class(region)
class(poblacion)
class(superficie)
In [ ]:
chile = matrix(c(poblacion,superficie), ncol=2, byrow=FALSE)
chile
In [ ]:
class(chile)
In [ ]:
colnames(chile)=c("poblacion","superficie")
rownames(chile)=region
chile
Una vez que los datos están ordenados en forma matricial, es mucho más fácil responder preguntas tales como
In [ ]:
chile[order(chile[,"poblacion"],decreasing=TRUE),]
In [ ]:
chile[order(chile[,"superficie"],decreasing=FALSE),]
La densidad de población se define como el número de personas por unidad de superficie. En nuestro caso, sería simplemente dividir la columna poblacion
por superficie
.
In [ ]:
chile[,'poblacion']/chile[,'superficie']
In [ ]:
densidad = poblacion/superficie
densidad
Para agregar columnas a una matriz usaremos la función cbind()
In [ ]:
chile <- cbind(chile, densidad)
chile
¿Qué sucede si queremos agregar una nueva columna que tiene datos mixtos, digamos numéricos y caractéres?
In [ ]:
codigo_region <- c("XV","I","II","III","IV","V","XIII","VI","VII","VIII","IX","XIV","X","XI","XII")
class(codigo_region)
In [ ]:
chile <- cbind(chile, codigo_region)
chile
In [ ]:
class(chile)
¿Que tal si queremos volver a calcular la densidad de población usando las columnas poblacion y superficie?
In [ ]:
chile[,'poblacion']/chile[,'superficie']
¿Porqué falló la división si antes funcionaba? ¿Habrá sido porque incluimos la columna codigo_region la cual contenia tipos de datos mixtos?
Partamos imprimiendo los tipos de clase de las columnas poblacion y superficie
In [ ]:
class(chile[,'poblacion'])
class(chile[,'superficie'])
¿Qué sucedió?
La columna codigo_region
es un vector que contiene datos de tipo caracter, y al ser incluida a la matriz todos los datos fueron convertidos al tipo de datos más general entre los tipos númerico y caracter: caracter.
Aquí vemos una gran limitación del tipo de datos matriz: No puede almacenar tipos de datos mixtos.
In [ ]:
region <- c("Arica y Parinacota","Tarapacá","Antofagasta")
poblacion <- c(308271,205566,551627)
superficie <- c(17446.20,41632.60,126048.80)
codigo_region <- c("XV","I","II")
# Podemos definir los labels de los elements usando names
chile = list(region, poblacion, superficie, codigo_region)
names(chile) = c("region","poblacion","superficie","codigo_region")
chile
# O directamente al momento de definir la lista
chile = list(region=region, poblacion=poblacion, superficie=superficie, codigo_region=codigo_region)
chile
In [ ]:
chile["region"]
In [ ]:
chile[c("region","poblacion")]
¿Que tal si queremos calcular la densidad de población?
In [ ]:
chile["poblacion"]/chile["superficie"]
La razón por la cual falla es porque chile[2]
sigue siendo una lista, y nosotros en verdad queremos acceder directamente al vector numérico. Para ello usamos llave cuadrada doble [[]]
.
In [ ]:
chile[["poblacion"]]/chile[["superficie"]]
Como podemos ver, las listas son un tipo de objeto que puede contener diferentes tipos de datos. A lo largo del curso iremos viendo situaciones donde las lostas son muy convenientes para almacenar datos.
Un dataframe es una estructura 2-dimensional que comparte propiedades entre una lista y una matriz. En estricto rigor, se define como una lista de vectores de igual largo.
Al igual que una lista y una matriz, un dataframe tiene las propiedades names()
, colnames()
y rownames()
. En el caso del dataframe,
names()
y colnames()
son equivalentes, y asignam los nombres de las columnasrownames()
asigna los nombres de las filaslength()
y ncol()
son equivalentes, y entregan el número de columnasnrow()
entrega el número de filas
In [ ]:
region <- c("Arica y Parinacota","Tarapacá","Antofagasta")
poblacion <- c(308271,205566,551627)
superficie <- c(17446.20,41632.60,126048.80)
codigo_region <- c("XV","I","II")
chile <- data.frame(poblacion, superficie, codigo_region)
colnames(chile) <- c("poblacion","superficie","codigo_region")
rownames(chile) <- region
chile
In [ ]:
chile["poblacion"]
In [ ]:
chile["densidad"] <- chile["poblacion"]/chile["superficie"]
chile
In [ ]:
region = c("Arica y Parinacota","Tarapacá","Antofagasta","Atacama","Coquimbo","Valparaíso","Metropolitana de Santiago","Libertador General Bernardo O'Higgins","Maule","Biobío","La Araucanía","Los Ríos","Los Lagos","Aisén del General Carlos Ibáñez del Campo","Magallanes y de la Antártica Chilena")
poblacion = c(308271,205566,551627,292054,714856,1859312,7150480,903248,1073635,2025995,933537,380618,835829,106893,158828)
superficie = c(17446.20,41632.60,126048.80,74806.30,40967.80,12646.28,15547.00,16583.30,30340.30,37068.70,31842.30,18577.60,48583.30,107449.40,1392783.70)
codigo_region <- c("XV","I","II","III","IV","V","XIII","VI","VII","VIII","IX","XIV","X","XI","XII")
chile <- data.frame(poblacion, superficie, codigo_region)
colnames(chile) <- c("poblacion","superficie","codigo_region")
rownames(chile) <- region
chile
Ordenar los datos del dataframe usando una columna
In [ ]:
chile[order(poblacion),]
In [ ]:
chile[order(-poblacion),]
Calcular promedios de columnas
In [ ]:
colMeans(chile["poblacion"])
In [ ]:
colMeans(chile[1:2])
Otra manera de calcular el promedio es usar la función apply()
In [ ]:
apply(chile["poblacion"], 2, mean)
In [ ]:
apply(chile["poblacion"], 2, sd)
In [ ]:
apply(chile["poblacion"], 2, sum)
Obtener un resumen del dataframe
In [ ]:
summary(chile)
In [ ]: