La función cancatenar, que se denota c(), permite adherir componentes de mismo tipo o diferentes en un solo “vector”.
## [1] 1 2 3 NA
NA significa no disponible (se puede usar cuando un dato no se encuentre en una base de datos). Los datos concatenados pueden ser enteros, numéricos o lógicos (T y F).
## [1] FALSE TRUE NA
Si se usa la función de concatenar para datos numéricos y lógicos, dicha función tomará una jerarquía sobre los datos numéricos, significa que hace una asignación de F con el 0 y T con el 1.
## [1] 1 2 3 4 5 0 1
Por otro lado, la función “is.na(x)” que es del mismo tamaño de x, pero con resultados lógicos entrada por entrada.
## [1] 1 2 3 4 NA
## [1] FALSE FALSE FALSE FALSE TRUE
El resultado NAN lo interpretamos como indeterminado, esto resulta cuando se hace un cálculo y se tiene una forma indeterminada como 0/0
## [1] NaN
Y obtendremos un resultado Inf cuando se haga una operación para el cual el resultado está indefinido, por ejemplo 1/0
## [1] Inf
Consideremo un ejemplo, donde utilicemos las instrucciones vistas hasta ahora
## [1] 1 2 3 0 1 NA Inf NaN
Consideremos un ejemplo un poco más elaborado, donde haremos una operación que posiblemente solo lo podamos hacer en este lenguaje.
## [1] 1.00 1.25 1.50 1.75 2.00
Utilizando la función de concatenar, construiremo un “vector” que es diferente en cuanto a la cantidad de componentes que tiene x, esto es,
## [1] 1.00 1.25 1.50 1.75 2.00 0.00 1.00 1.25 1.50 1.75 2.00
Note que y tiene 11 componentes (5 de x, luego un cero y luego nuevamente 5 de x). Entonces definiremos una “operación aritmética” de la siguiente manera:
## Warning in 2 * x + y: longitud de objeto mayor no es múltiplo de la
## longitud de uno menor
## [1] 4.00 4.75 5.50 6.25 7.00 3.00 4.50 5.25 6.00 6.75 5.00
Ahora consideremos un vector x, cualcuiqre acon entradas numéricas o enteras y calculemos algunos elementos de dicho vector como: valor mínimo, valor máximo, longitud (no confundir con la norma), media, la suma de los elementos y la varianza.
## [1] 1.0 4.0 -2.0 5.0 3.1
## [1] 5
## [1] -2
## [1] 5
## [1] 11.1
## [1] -124
## [1] 2.22
## [1] 7.742
Otra operación importante que podemos hacer dado un “vector” es ordenaros en forma creciente, esto lo hacemos con el comando sort
## [1] 1.0 4.0 -2.0 5.0 3.1
## [1] -2.0 1.0 3.1 4.0 5.0
Entre las operaciones básicas se encuentre la de redondeo y truncamiento; también podemos pedir una cantidad de decimales, esto tiene sentido cuando el número es irracional. Por ejemplo, la raíz cuadrada de dos. Usaremos el comando print para que nos despliegue la cantidad de decimales que necesitemos ya que solo calcular la raíz nos proporcona una cantidad de decimales.
## [1] 1.414214
## [1] 1.4142135623731
En ocasiones necesitamos de hacer algún tipo de redondeo o truncamientos de números con decimales.
## [1] 1
## [1] 3
Dado un número con decimales se puede elegir un entero a partir de el tomando solo la parte entera o el entero inmediato superior.
## [1] 4
## [1] 4
El comando ceiling toma el entero superior, en ocasiones a esa función se la llama la función techo.
## [1] 5
Para definir una función se asigna una variable y se colocan el argumento de la función y la descripción de la regla de asignación escritas entre llaves.
## [1] 198.4132
## [1] 10.09861
## [1] 4.718282 15.389056
## [1] 4.718282
## [1] 15.38906
## [1] 4.718282 15.389056
## [1] 4.718282
## [1] 15.38906
El data.frame es una organización de dato en tablas (como excel) que nos puede permitir tener organizada las variables por columnas (o filas) y con base en ella poder hacer algún tipo de análisis y cálculos como la regresión lineal.
## [1] 1 2 3 5 7 9 11 13
## [1] 76.11 86.45 95.27 109.18 122.03 133.73 143.73 156.41
## [1] "numeric"
## [1] "numeric"
## edad altura
## 1 1 76.11
## 2 2 86.45
## 3 3 95.27
## 4 5 109.18
## 5 7 122.03
## 6 9 133.73
## 7 11 143.73
## 8 13 156.41
# después de data.frame colocamos los argumentos de esta función e indicamos el orden en el que queremos que aparezcan las columnas. de igual manera podemos hacer una representación gráfica usando el comando plot y colocando como argumento el nombre del data.frame.
plot(datos1)
Si queremos trazar la recta de regresión usamos el comando lm y en el argumento colocamos la variable dependiente seguida de la independisnte peo conectadas por ~, esdecir, lm(altura~edad, datos1) esto se hace ya que en el data frame el de las variables está de otra forma.
##
## Call:
## lm(formula = altura ~ edad, data = datos1)
##
## Coefficients:
## (Intercept) edad
## 73.968 6.493
Al tener solo dos columnas regresa los coeficientes de la regresión lineal simple, estos es, la intersección con el eje de variable dependiente y la pendiente de la recta.
Si queremos visualizar la recta usamos el comando abline(lm(altura~edad,data=datos1)). Es importante que esté el diagrama de dispersión para luego se ponga en el mismo plano la recta de regresión.
Si queremos obtener toda la información de la regresión, utilizamos el comando summary(lm(altura~edad,data=datos1)).
##
## Call:
## lm(formula = altura ~ edad, data = datos1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.351 -1.743 0.408 2.018 2.745
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 73.9681 1.7979 41.14 1.38e-08 ***
## edad 6.4934 0.2374 27.36 1.58e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.746 on 6 degrees of freedom
## Multiple R-squared: 0.992, Adjusted R-squared: 0.9907
## F-statistic: 748.4 on 1 and 6 DF, p-value: 1.577e-07
## value numdf dendf
## 748.3922 1.0000 6.0000
El comando read.table permite leer un archivo de internet o de algun programa particular o guardado en el equipo. Usas header=T si quieres que el archivo conserve el nombre de las variables y pueda leer el tipo de variable.
## 'data.frame': 1078 obs. of 2 variables:
## $ Padres: num 65 63.3 65 65.8 61.1 ...
## $ Hijos : num 59.8 63.2 63.3 62.8 64.3 ...
Por otro lado, str() te dice el tipo de estructura interna del data.frame o cualquier otro “arreglo”
¿Cómo construir vectores?
Un vector es una secuencia de datos, los uales pueden ser de tipo lógicos, enteros, numéricos, complejos o caracteres. La manera de construir un vector es haciendo una asignación con la función c.
## [1] 1 5 6 7 2 3 2 5 1 0
## [1] "Pep" "Giselle" "Allegendre"
Las entradas de cada vector debe contener elmentos del mismo tipo, de no ser así R los convierte automáticamente en datos del mismo tipo siguiendo la regla:
character>complex>numérico>entero>logico
## [1] "2" "3.5" "TRUE" "casa"
## function (...) .Primitive("c")
Si notammos el resultado de salida, todos los elementos del vector loc convirtió en palabras, por el orden que mencionamos anteriormente.
Otra forma de generar vectores es con el comando scan(), en este caso el ingreso de las entradas del vector son manuales:
x_scan=scan()
#Metemos manualmente los datos que se generarán un vector. Dichos datos se meten en la consola
Se puede generar vectores usando el comando sapply, que permite que una función definida se aplique a cada componente a una sucesión específica, Sapply (vector, función).
## [1] 3
Si quisieramos calcular la media de los números entre 20 y 30, la función no lo podrá calcular y para ello usaremos el comando sapply.
## [1] 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5
Una manera de calcular vectores mediante una sucesión y por tanto mediante una función que depende de el índice n.
## [1] -14 -8 4 28 76 172 364 748
## [9] 1516 3052 6124 12268 24556 49132 98284 196588
## [17] 393196 786412 1572844 3145708
## [1] 0.50000000 0.40000000 0.30000000 0.23529412 0.19230769 0.16216216
## [7] 0.14000000 0.12307692 0.10975610 0.09900990 0.09016393 0.08275862
## [13] 0.07647059 0.07106599 0.06637168 0.06225681 0.05862069 0.05538462
## [19] 0.05248619 0.04987531
## [1] 0.50000000 0.40000000 0.30000000 0.23529412 0.19230769 0.16216216
## [7] 0.14000000 0.12307692 0.10975610 0.09900990 0.09016393 0.08275862
## [13] 0.07647059 0.07106599 0.06637168 0.06225681 0.05862069 0.05538462
## [19] 0.05248619 0.04987531
También se puede exscribirla sucesión sin definir a la n, solo colocando el rango del índice.
## [1] 0.00000000 0.50000000 0.40000000 0.30000000 0.23529412 0.19230769
## [7] 0.16216216 0.14000000 0.12307692 0.10975610 0.09900990 0.09016393
## [13] 0.08275862 0.07647059 0.07106599 0.06637168 0.06225681 0.05862069
## [19] 0.05538462 0.05248619 0.04987531
Se pueden hacer ciertas operaciones con vectores.
## [1] 1 5 6 2 5 7 8 3 5 2 1 0
## [1] 12
## [1] 8
## [1] 0
## [1] 45
## [1] 0
## [1] 3.75
## [1] 1 6 12 14 19 26 34 37 42 44 45 45
## [1] 4 1 -4 3 2 1 -5 2 -3 -1 -1
## [1] 0 1 1 2 2 3 5 5 5 6 7 8
## [1] 8 7 6 5 5 5 3 2 2 1 1 0
## [1] 0 1 2 5 3 8 7 5 2 6 5 1
El comando sum puede calcular los valores de una suma o serie. Por ejemplo \[\sum_{n=0}^{20}{\frac{1}{n^2+1}}\]
## [1] 2.027942
Una nueva forma de calcularla es usando el comando cumsum
n=0:20
x=1/(n^2+1) #Esto despliegaría todos los elementos de la suceción como un vector
cumsum(x)# Esto calculala suma acumulada de x, por ello el último dato coincide con el resultado del ejemplo anterior.
## [1] 1.000000 1.500000 1.700000 1.800000 1.858824 1.897285 1.924312
## [8] 1.944312 1.959697 1.971892 1.981793 1.989990 1.996886 2.002768
## [15] 2.007845 2.012269 2.016160 2.019609 2.022686 2.025448 2.027942
Dado un vector, podemos construir a partir de el un subconjunto, que sería un vector de longitud menor o igual que la del vector original y con alguna caracteristica particular, por ejemplo elegir el que esté en la posisición 2 o los que esten entre la posición 2 y la 5.
## [1] -3 0 4 5 8 9 6 10
## [1] 0
## [1] 0 4 5 8
Notemos que la asignación del vector lo hacemos con la función concatenar y luego la elección de un elemento en particular o de un rango de elementos (sin exceder el tamaño de del vector original) se hace con la variable asignada seguida de corchetes y dentro el elemento a elegir o el rango de elementos.
Consideremos el siguiente ejemplo:
## [1] -2 4 6 7 9 1 8
## [1] -2 1 4 6 7 8 9
## [1] 6
Esto es una manera, muy tardada, de calcular la mediana de los datos usando el comando sort y luego eligiendo el dato que está situado a la mitad.
Así como como se vio en los ejemplos anteriores de cómo selccionar de un vector un subconjunto de el (en términos de sus componentes), existe otra forma de hacerlo de uuna manera donde no implique el orden de los datos o las componentes, es decir, de un conjunto de datos decidir que elementos no voy a alegir, eso lo hacemos con la siguiente instrución
## [1] -1 -2 -5
Esto indica que de los 6 datos hay que excluir los que estén en el rango 4:6, eso se denota con x[-(1:3)]. El signo menos tiene una forma de actuar distinta a la arirmética, esto es, no implica cambiarles el signo a los elementos que están entre el 1 y el 3.
Un caso particular para seleccionar algun elemento del vector, podemos usar vector[length(vector)-i)] resulta el i+1-ésima entrada del vector empezando por el final.
## [1] 2
## [1] 8
## [1] -5
Dado un vector tomaremos un subconjunto colocando alguna condición sobre las entradas, un poco más general o más específico que los ejemplos anteriores.
## [1] 5 6 5 7 8 5
## [1] 5 5 3 5
## [1] 1 6 7 8 3 1 0
## [1] 1 6 2 7 8 2 1 0
## [1] 5 6 5 7 8 5
## [1] 6 2 8 2 0
Una vez que se define un vector x, colocar la notación x>3 genera un vector lógico del mismo tamaño que x, solo que con entradas F o T.
## [1] FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE FALSE
## [12] FALSE
También podemos pedir la posición o índices de los elementos del vector x que cumplen alguna condición, por ejemplo x>a, para esto se usa el comando which(condición sobre x)
## [1] 1 5 6 2 5 7 8 3 5 2 1 0
## [1] 2 3 5 6 7 9
## [1] 2 5 8 9
## [1] 1 3 6 7 8 11 12
## [1] 3 4 7 10 12
## [1] 12
## [1] 7
Si en lugar de tener la primera posición del valor mínimo o máximo, quisieramos todas las posiciones donde aparecen los valores máximos o mínimos podemos hacerlo con el comando which u en el argumento colocariamos \(x==min(x)\)
x=c(1,5,8,2,5,7,8,3,5,2,1)
which(x==min(x)) #Proporciona todas las posiciones donde aparece el valor mínimo de x
## [1] 1 11
## [1] 3 7
También podemos cambiar las entradas de un vector dado, es decir, en cierta posición reemplazar el número que está por otro.
## [1] 1 5 8 2 5 7 8 3 5 2 1
## [1] 1 5 15 2 5 7 8 3 5 2 1
y=c(1,5,8,2,5,7,8,3,5,2,1)
y[c(2,3,4)]=y[c(2,3,4)]+10 #sumará 10 a los números que están en la posisicón 2, 3 y 4
y
## [1] 1 15 18 12 5 7 8 3 5 2 1
z=c(1,5,8,2,5,7,8,3,5,2,1)
z[(length(x)-2):length(x)]=0 # Las últimas tres entradas de z se hacen cero.
z
## [1] 1 5 8 2 5 7 8 3 0 0 0
z[length(z)+3]=2#Genera tres posiciones más al vector z y el último de estos tres es 2, por tanto los otros dos colocará NA
z
## [1] 1 5 8 2 5 7 8 3 0 0 0 NA NA 2
Un factor es como un vector, pero con una estructura interna más general. El factor es una estructura de datos para manejar variables categóricas.
ciudades=c("Leon","Mina","Oaxaca","Leon","Oaxaca","Oaxaca","Oaxaca","Mina","Mina")#Esto es un vector cuyas entradas son caracteres o cadenas
ciudades
## [1] "Leon" "Mina" "Oaxaca" "Leon" "Oaxaca" "Oaxaca" "Oaxaca" "Mina"
## [9] "Mina"
ciudades.factor=factor(ciudades) #Proporciona los elementos del vector, pero eliminando la estructura (quitando comillas) y menciona los niveles del factor.
ciudades.factor
## [1] Leon Mina Oaxaca Leon Oaxaca Oaxaca Oaxaca Mina Mina
## Levels: Leon Mina Oaxaca
El factor contiene un atributo importante llamado niveles y cada elemento del factor es un nivel, entonces, los niveles clasifican al factor. Por tanto, podemos concebir a un factor como una lista formada por copias de etiquetas (los niveles).
Para crear un factor a partir de un vector usando las funciones factor o as.factor. La última de estas funciones convierte un vector en factor y toma como niveles los diferentes valores que aparecen en el vector, mientras que la función factor define un factor apartir del vector y permite modificar el factor que se crea, tales como:
levels, permite especificar los niveles e incluso añadir niveles que no aparecen en el vector.
labels, permite cambiar los nombres de los niveles
s=c("M","M","F","M","F","F","M")
sex=as.factor(s)#Genera un factor quitando las comillas y mencionando los niveles
sex
## [1] M M F M F F M
## Levels: F M
## [1] M M F M F F M
## Levels: F M
sex3=factor(s,levels=c("M","F","B"))# se añade un buevo nivel B y se cambia el orden en que se visualiza
sex3
## [1] M M F M F F M
## Levels: M F B
sex4=factor(s,levels=c("M","F","B"),labels=c("Masc","Fem","Bis")) #con esto cambiamos de nombre los niveles
sex4
## [1] Masc Masc Fem Masc Fem Fem Masc
## Levels: Masc Fem Bis
Para obtener los niveles de un factor se puede usar el comando levels y también puede servir para cambiar los niveles de un factor
notas=as.factor(c(1,2,2,3,1,3,2,4,2,3,4,2))#Este comando genera un factor aunque no sean los elementos cadenas.
notas
## [1] 1 2 2 3 1 3 2 4 2 3 4 2
## Levels: 1 2 3 4
levels(notas)=c("Muy.mal","Mal","Bien","Muy.bien")#Permite cambiar el nombre de los niveles y por tanto las entradas del vector definido al principio, pero manteniendo el orden de los niveles.
notas
## [1] Muy.mal Mal Mal Bien Muy.mal Bien Mal
## [8] Muy.bien Mal Bien Muy.bien Mal
## Levels: Muy.mal Mal Bien Muy.bien
Hay dos tipos de factores: simples y ordenados. Hasta ahora estudiamos el primer tipo y hemos cambiado los niveles, ahora vamos hacer un factor donde los niveles se ordenan usando el comando ordered. Tomando el ejemplo anterior tenemos
## [1] Muy.mal Mal Mal Bien Muy.mal Bien Mal
## [8] Muy.bien Mal Bien Muy.bien Mal
## Levels: Muy.mal < Mal < Bien < Muy.bien