Introducción a R, para Sabrina.

Este es un documento de consulta hecho para ayudarte a poder recuperar conocimiento de manera rapida, esta hecho para ti y pensando en ti.

Data.frame()

Creacion de data.frame()

Para la creación de data.frame; necesarios para el analisis de cierto tipo, probablemente es esto en lo que se basan el uso de una gran parte de las paqueterias de R; 1ero se creán los vectores de datos, ejemplo:

edad<-c(22,34,33,67,56)
tiempo<-c(22,25,24,30,27)
sexo<-c("H","H","M","H","M")

Luego se usa el comando, data.frame()

datos<-data.frame(edad,tiempo,sexo)

lo anterior crea un data.frame, para poder ver el objeto creado usamos

#View(datos) #si los datos son muchos
datos #si los datos son pocos
##   edad tiempo sexo
## 1   22     22    H
## 2   34     25    H
## 3   33     24    M
## 4   67     30    H
## 5   56     27    M

Notas: * se puede observar que los datos estan ordenados de forma en la que fueron escritos + el valor 22 en edad esta primero y 56 de último + el valor 22 en tiempo es primero asi como 27 es el último * las columnas edad,tiempo y sexo, estan ordenadas de acuerdo a su posición en la orden “data.frame()”, es decir primera columna es edad y última es sexo

si se desea saber los nombre de un data.frame o una base de datos se puede usar el comando “names()”, ejemplo

names(datos)
## [1] "edad"   "tiempo" "sexo"

la salida de lo anterior nos da los nombres de la base de datos llamada “datos”

Obtención de columnas

Para poder realizar una solicitud a una base de datos de una columna hacemos lo siguiente:

datos$edad
## [1] 22 34 33 67 56
datos$sexo
## [1] H H M H M
## Levels: H M

Clasificación por filas

Supongamos que obtengo los datos siguientes

nombres<-c("Mario","Saul","Marta","Javier","Lulu")

estos son los nombres de las personas encuestadas antes, para poder agregarlos a la base de datos se tendria que hacer lo siguiente

datos2<-data.frame(nombres,datos)

o se puede renombrar la base de datos usando todas las columnas, es decir

datos2<-data.frame(nombres,edad,tiempo,sexo)

ambos procesos nos dan los mismos resultados, solo que uno de una manera más rapida que el otro

ahora supongamos que quiero que la base de datos no solo este regida por la clasificación por columnas, si no que igual la quiero por filas, esto sirve cuando queremos asignarle a dentro del data.frame, una sub clasificación dicho de otra manera, nos sirve para darle a datos dentro de el total de datos un nombre, por ejemplo, el nombre “Mario” puede ser el representante de los datos edad=22, tiempo=22, sexo=“H”; de esta forma saber que esos datos son de esta persona o conjunto

Para hacer lo anterior, usaremos el comando “row.names()”

row.names(datos)=datos2$nombres #si los nombres estan en un data.frame
row.names(datos)=nombres # si se tiene el vector de nombres
datos #para ver lo hecho
##        edad tiempo sexo
## Mario    22     22    H
## Saul     34     25    H
## Marta    33     24    M
## Javier   67     30    H
## Lulu     56     27    M

otra forma de obtener un resumen de los datos, una vez que esten nombrados en una sola base de datos, ejemplo los datos de la variable datos2, es usando el comando str().

Consulta de Estrutura de una B.D.

Para consultar la estructura de una base de datos usaremos str(), con este comando podemos ver que tipo de B.D. tenemos en memoria, para este caso

str(datos) #Podemos ver en la salida que datos es un data.frame
## 'data.frame':    5 obs. of  3 variables:
##  $ edad  : num  22 34 33 67 56
##  $ tiempo: num  22 25 24 30 27
##  $ sexo  : Factor w/ 2 levels "H","M": 1 1 2 1 2

Se concluye que la B.D. datos es un “data frame” con las variables, edad, tiempo y sexo, cada una de ellas muestra sus detalles.

Para la seccion del cálculos

En R podemos realizar cálculos de interes, como ejemplo tenemos los siguientes * Media Varianza Desviación estandar Covarianza Coeficiente de correlación

mean(datos$edad) #media
## [1] 42.4
var(datos$edad) #varianza
## [1] 341.3
sd(datos$edad) #desviación estandar
## [1] 18.47431
cov(datos$edad,datos$tiempo) #covarianza
## [1] 55.2
cor(datos$edad,datos$tiempo,method = "pearson") #correlación de pearson
## [1] 0.979782

Para hacer tablas de frecuencias, aquellas que cuentan el numero de elementos de cada tipo, podemos usar el siguiente comando

print('Tabla que cuenta por sexo')
## [1] "Tabla que cuenta por sexo"
table(datos$sexo) #frecuencias por sexo
## 
## H M 
## 3 2
print('Tabla que cuenta por edad y por sexo')
## [1] "Tabla que cuenta por edad y por sexo"
table(datos$edad,datos$sexo) #frecuencias relacionadas
##     
##      H M
##   22 1 0
##   33 0 1
##   34 1 0
##   56 0 1
##   67 1 0
print('Tabla que cuenta por edad y por sexo, otro orden')
## [1] "Tabla que cuenta por edad y por sexo, otro orden"
table(datos$sexo,datos$tiempo) #frecuencias relacionadas
##    
##     22 24 25 27 30
##   H  1  0  1  0  1
##   M  0  1  0  1  0

attach

Para hacer los calculos anteriores sin tener que escribir tantas veces la palabra datos, podemos usar lo siguiente

attach(datos)
## The following objects are masked _by_ .GlobalEnv:
## 
##     edad, sexo, tiempo
table(sexo)
## sexo
## H M 
## 3 2
table(edad,sexo)
##     sexo
## edad H M
##   22 1 0
##   33 0 1
##   34 1 0
##   56 0 1
##   67 1 0
table(sexo,tiempo)
##     tiempo
## sexo 22 24 25 27 30
##    H  1  0  1  0  1
##    M  0  1  0  1  0
detach(datos)

similar a lo anterior podemos usar el comando, with(), ejemplo

with(datos,{
   sexo
   table(edad,sexo)
   table(sexo,tiempo)
})
##     tiempo
## sexo 22 24 25 27 30
##    H  1  0  1  0  1
##    M  0  1  0  1  0

Consultas

En SQL vimos lo que es una consulta, en SQL se usa el comando select, este nos da un subconjunto de los datos, los criterios de agrupación, es decir la regla de validación del conjunto se da en las sentencias from, where y having; En R podemos usar lo siguiente:

hombres=subset(datos,sexo=="H")
#mostrar la consulta llamada hombres
hombres
##        edad tiempo sexo
## Mario    22     22    H
## Saul     34     25    H
## Javier   67     30    H

o podemos realizar una consulta de las personas con edad mayor a 25:

mayor25<-subset(datos,edad>25)
#mostrar comsulta
mayor25
##        edad tiempo sexo
## Saul     34     25    H
## Marta    33     24    M
## Javier   67     30    H
## Lulu     56     27    M

Las consultas son muy utiles, nos permiten obtener información de una base de datos de manera selectiva, muchas veces al hacer una pregunta sobre los datos, es una consulta la que da respuesta. Acontinuación se mostrara una consulta con doble condicional; Supongamos que queremos saber cuantas personas mayores de 33 años y de sexo mujer hay en la base de datos, la solución se encuentra en la siguiente consulta:

mayor33Mujer<-subset(subset(datos,sexo=="M"),edad>33)
#mostramos datos
mayor33Mujer
##      edad tiempo sexo
## Lulu   56     27    M

lo anterior puede parecer engorroso, podemos ver que se realizo una consulta de sexo igual a “M” y a esa base de datos otra consulta con edad mayor a 33; Para casos más complejos, el realizar consultas anidadas puede ser un problema, ya que puede ser lento y engorroso, para poder solucionar esto se puede usar una query por MySQL. En R en algunas versiones se puede soportar consultas sin anidarlas, solo aplicando dentro de la sentencia un conector logico, los conectores logicos son, and y or, representados por “&” y por “|”. Por lo anterior la consulta mayor33Mujer se puede hacer de la siguiente manera

mayor33Mujer<-subset(datos, sexo=="M" & edad>33)
#mostrar
mayor33Mujer
##      edad tiempo sexo
## Lulu   56     27    M

el resultado es correcto y es igual al obtenido anteriormente. Para hacer una consulta del numero de personas mujeres o mayores a 25, hacemos lo siguiente

mayor25Mujer<-subset(datos,sexo=="M" | edad>25)
#mostrar datos
mayor25Mujer
##        edad tiempo sexo
## Saul     34     25    H
## Marta    33     24    M
## Javier   67     30    H
## Lulu     56     27    M

como mario es hombre y menor de 25 años, el no aparece en la consulta anterior. Se puede realizar una consulta donde se seleccione las columnas a ver, suponga que quiere saber el nombre y edad de las personas que son hombres, por lo que hacemos lo siguiente

hombrenombre<-subset(datos,sexo=="H",select = edad) 
#mostrando datos
hombrenombre
##        edad
## Mario    22
## Saul     34
## Javier   67

En este caso no se uso la columna nombre porque esta esta por default al ser una clasificacion por filas, la base de datos “datos2” no recibio dicha clasificación por lo que es necesario usar “nombres” en la seleccion para poder ver estas dos columnas:

hombrenombre<-subset(datos2,sexo=="H",select = c(nombres,edad)) 
#mostrando datos
hombrenombre
##   nombres edad
## 1   Mario   22
## 2    Saul   34
## 4  Javier   67

si no se selecciona no se veran los nombres, supongamos que solo quiero ver la edad de las personas de sexo mujer, no podemos usar la base de datos con clasificacion por filas, ya que esa muestra po default los nombres, así que usaremos una base de datos clacificada unicamente por columnas, es decir:

mujeredad<-subset(datos2,sexo=="M",select = edad) 
#mostrando datos
mujeredad
##   edad
## 3   33
## 5   56

se muestran lo elementos 3 y 5 de la base de datos llamada “datos2”.

Combinación de dataframes

Si tenemos dos dataframes con la misma estructura (idénticas variables), pero distintos datos, podemos combinarlos pegando uno a continuación del otro mediante rbind (acrónimo de rowbind, pegar por filas), para ejemplo de lo anterior podemos hacer como ejemplo lo siguiente. Se declara alumnos1

alumnos1<-data.frame(nombres,calificaciones=c(80,70,90,70,85),sexo)
#mostrar
alumnos1
##   nombres calificaciones sexo
## 1   Mario             80    H
## 2    Saul             70    H
## 3   Marta             90    M
## 4  Javier             70    H
## 5    Lulu             85    M

Supongamos que tenemos otra base de datos de otro grupo, llamemosla alumnos2

alumnos2<-data.frame(nombres=c("Saul","Manuel","Casandra","Roger","Lulu"),calificaciones=c(90,99,100,70,80),sexo)
#mostrar
alumnos2
##    nombres calificaciones sexo
## 1     Saul             90    H
## 2   Manuel             99    H
## 3 Casandra            100    M
## 4    Roger             70    H
## 5     Lulu             80    M

Podemos ver que las bases de datos comparten datos entre sí, por ejemplo el nombre saul, pero debemos saber que por el contexto del problema sabemos que son diferentes personas ¡incluso tienen diferentes calificaciones! El comando rbind nos puede generar una base de datos de todos los alumnos de la escuela con dos grupos, llamemos a esa base de datos “alumnos”:

alumnos<-rbind(alumnos1,alumnos2)
alumnos
##     nombres calificaciones sexo
## 1     Mario             80    H
## 2      Saul             70    H
## 3     Marta             90    M
## 4    Javier             70    H
## 5      Lulu             85    M
## 6      Saul             90    H
## 7    Manuel             99    H
## 8  Casandra            100    M
## 9     Roger             70    H
## 10     Lulu             80    M

Lo anterior literalmente pega la base de datos tras la otra, podemos ver que se conservan los dos nombres saul y lulu dos veces. Si quisieramos realizar una consulta de cuales nombres se repiten entre las bases de datos podemos usar el comando merge, solo que tendriamos que hacer unas modifcaciones. Primero hay que saber que el comando merge solo mostrar los datos que son iguales en una clasificacion por filas, es decir, para merge “Saul 70” es diferente de “Saul 90”, ¡y es que lo son! por lo que si queremos ver los nombres que se repiten hay que evitar meter en el comando merge los datos la columna calificaciones; Esto se resuelve usando la clasificación “by”

consulta<-merge(alumnos1,alumnos2,by="nombres")
consulta
##   nombres calificaciones.x sexo.x calificaciones.y sexo.y
## 1    Lulu               85      M               80      M
## 2    Saul               70      H               90      H

Podemos realizar por calificaciones

consulta<-merge(alumnos1,alumnos2,by="calificaciones")
consulta
##   calificaciones nombres.x sexo.x nombres.y sexo.y
## 1             70      Saul      H     Roger      H
## 2             70    Javier      H     Roger      H
## 3             80     Mario      H      Lulu      M
## 4             90     Marta      M      Saul      H

Podemos notar que obtenemos la clasificación por cada numero.

Ordenación de dataframes

Demanera directa podemos usar el comando order() para ordenar una base datos, por ejemplo si queremos ordenar la base de datos alumnos en orden alfabetico, hacemos lo siguiente

alumnos[order(alumnos$nombres),,]
##     nombres calificaciones sexo
## 4    Javier             70    H
## 5      Lulu             85    M
## 10     Lulu             80    M
## 1     Mario             80    H
## 3     Marta             90    M
## 2      Saul             70    H
## 6      Saul             90    H
## 8  Casandra            100    M
## 7    Manuel             99    H
## 9     Roger             70    H

Es necesario agregar las dos comas ya que la orden entre parentesis [] son la ordenacion de impresion viendo la data.frame como una especie de vector, por lo que al tener 3 columnas en nuestra data.frame, se tienen que agregar dos comas, la regla es, el numero de columnas-1 es el numero de comas.

Si queremos realizar una ordenación y despues un subordenación hacemos lo siguiente:

alumnos[order(alumnos$nombres,alumnos$calificaciones),,]
##     nombres calificaciones sexo
## 4    Javier             70    H
## 10     Lulu             80    M
## 5      Lulu             85    M
## 1     Mario             80    H
## 3     Marta             90    M
## 2      Saul             70    H
## 6      Saul             90    H
## 8  Casandra            100    M
## 7    Manuel             99    H
## 9     Roger             70    H

Se puede ver que dentro de la ordenación, lulu esta ordenado en modo creciente, al igual saul.

Si queremos que la ordenación se haga demanera decreciente podemos hacer lo siguiente:

alumnos[order(alumnos$nombres,alumnos$calificaciones ,decreasing = TRUE),,]
##     nombres calificaciones sexo
## 9     Roger             70    H
## 7    Manuel             99    H
## 8  Casandra            100    M
## 6      Saul             90    H
## 2      Saul             70    H
## 3     Marta             90    M
## 1     Mario             80    H
## 5      Lulu             85    M
## 10     Lulu             80    M
## 4    Javier             70    H

Se puede ver que se realizo un ordenamiento de manera decreciente, incluso las calificaciones en el caso de lulu y saul

Cambiar forma de una B.D.

Supongamos que tenemos una base de datos (B.D.) en la que se tiene repetido una variable, ejemplo

nuevacalificaciones<-data.frame(calificaciones2=c(99,78,79,85,86,95,84,92,86,66),calificaciones3=runif(10,min=60,max = 100))

alumnosnueva<-cbind(Nombre=alumnos$nombres,calificaciones=alumnos$calificaciones,nuevacalificaciones)
alumnosnueva
##      Nombre calificaciones calificaciones2 calificaciones3
## 1     Mario             80              99        88.81741
## 2      Saul             70              78        79.88845
## 3     Marta             90              79        75.21207
## 4    Javier             70              85        89.07684
## 5      Lulu             85              86        73.74253
## 6      Saul             90              95        94.26263
## 7    Manuel             99              84        67.12339
## 8  Casandra            100              92        97.52291
## 9     Roger             70              86        85.54336
## 10     Lulu             80              66        90.99260

en la base anterior se uso el comando cbind() el cual es equivalente a rbind() solo que con columnas, es decir, une data.frames apartir de las columnas. Igual se uso el comando runif(), este es un comando usado en simulacion de V.A. (variables aleatorias) el cual nos permite crear aleatoriamente un vector de valores, con un minimo y un maximo, cada valor es igualmente probable.

Sin más preambulos iremos a resolver el problema planteado en esta sección, procederemos a hacer una “trasformación” de la B.D., para ello usaremos el comando reshape():

modificacion<-reshape(alumnosnueva,varying = list(2:4), v.names = "Calificacion",direction = "long",timevar = "Bim")
modificacion
##        Nombre Bim Calificacion id
## 1.1     Mario   1     80.00000  1
## 2.1      Saul   1     70.00000  2
## 3.1     Marta   1     90.00000  3
## 4.1    Javier   1     70.00000  4
## 5.1      Lulu   1     85.00000  5
## 6.1      Saul   1     90.00000  6
## 7.1    Manuel   1     99.00000  7
## 8.1  Casandra   1    100.00000  8
## 9.1     Roger   1     70.00000  9
## 10.1     Lulu   1     80.00000 10
## 1.2     Mario   2     99.00000  1
## 2.2      Saul   2     78.00000  2
## 3.2     Marta   2     79.00000  3
## 4.2    Javier   2     85.00000  4
## 5.2      Lulu   2     86.00000  5
## 6.2      Saul   2     95.00000  6
## 7.2    Manuel   2     84.00000  7
## 8.2  Casandra   2     92.00000  8
## 9.2     Roger   2     86.00000  9
## 10.2     Lulu   2     66.00000 10
## 1.3     Mario   3     88.81741  1
## 2.3      Saul   3     79.88845  2
## 3.3     Marta   3     75.21207  3
## 4.3    Javier   3     89.07684  4
## 5.3      Lulu   3     73.74253  5
## 6.3      Saul   3     94.26263  6
## 7.3    Manuel   3     67.12339  7
## 8.3  Casandra   3     97.52291  8
## 9.3     Roger   3     85.54336  9
## 10.3     Lulu   3     90.99260 10

no hay que olvidar que lo anterior funciona si la base de datos es un data.frame() de lo contrario no se garantiza que funcione. Si no sabes si tus datos son un data.frame puedes usar

str(alumnosnueva)
## 'data.frame':    10 obs. of  4 variables:
##  $ Nombre         : Factor w/ 8 levels "Javier","Lulu",..: 3 5 4 1 2 5 7 6 8 2
##  $ calificaciones : num  80 70 90 70 85 90 99 100 70 80
##  $ calificaciones2: num  99 78 79 85 86 95 84 92 86 66
##  $ calificaciones3: num  88.8 79.9 75.2 89.1 73.7 ...

debe decir ‘data.frame’.

Analisis de una B.D.

Para continuar se usara los siguientes datos

Bases de datos

Desviacion estandar

canes.DS<-read.table(file = "https://raw.githubusercontent.com/crissthiandi/datos/master/sabrina/Desviacion-estandar", header = TRUE, sep = "\t", dec = ".")
canes.DS
##    Character D..sexcinctus D..bibronii D..leopardinus D..darwinii
## 1        SPL          0.56        0.72           0.65        0.30
## 2        INF          0.84        0.78           0.65        0.49
## 3        SNR          0.58        0.44           0.39        0.46
## 4      SSoSp          0.63        0.48           0.50        0.46
## 5        SNG          4.69        4.81           3.72        2.51
## 6        PSF          0.57        0.65           0.43        0.54
## 7       INPM          1.64        1.67           0.92        0.63
## 8        SEE          2.35        2.82           1.95        1.45
## 9        PMS          0.19        0.28           0.61        0.00
## 10       SAB         11.49       10.35           6.93       11.13
## 11      SMDL         13.76       14.53           8.36       14.26
## 12      SMDH          4.22        4.02           3.75        2.76
## 13       SVL         14.61       16.10          26.69       14.02
## 14        TL         13.32       18.35          24.39       14.87
## 15       MAX          3.84        4.42           7.28        3.32
## 16        HL          4.07        4.65           7.99        3.98
## 17       DEO          1.97        2.40           4.22        2.09
## 18       DEN          1.11        1.26           1.81        0.84
## 19     DPOEF          2.28        2.73           4.61        1.82
## 20       DIS          2.54        2.92           4.71        2.71
## 21       SGF          4.79        5.45           8.66        4.30

En los datos se encuentran el registro de desviaciones estandar de ciertas medidas para ciertas especies, no entraremos en detalle de los datos pero diremos que nos interesa saber que relación hay en ella, procederemos a hacer un estudio de esta base de datos.

Medias

canes.medias<-read.table(file="https://raw.githubusercontent.com/crissthiandi/datos/master/sabrina/Medias", header = TRUE, sep = "\t",dec = ".")
canes.medias
##    Character D..sexcinctus D..bibronii D..leopardinus D..darwinii
## 1        SPL         12.11       11.79          12.33        9.90
## 2        INF         11.75       11.68          11.67        9.40
## 3        SNR          2.82        2.98           3.08        1.30
## 4      SSoSp          3.07        3.83           3.75        2.30
## 5        SNG         63.25       66.06          68.75       53.10
## 6        PSF          3.52        3.87           3.75        3.90
## 7       INPM          9.48       12.64          12.00        8.00
## 8        SEE         22.27       25.98          23.75       18.90
## 9        PMS          2.04        3.91           3.83        2.00
## 10       SAB        182.00      181.43         173.33      166.60
## 11      SMDL        166.00      171.68         145.75      153.80
## 12      SMDH         31.13       32.60          30.33       24.40
## 13       SVL         70.85       77.57          84.00       66.83
## 14        TL         70.34       73.51          84.06       61.23
## 15       MAX         17.00       19.95          20.19       16.14
## 16        HL         20.11       22.27          24.91       18.37
## 17       DEO          8.40       10.12          10.72        7.97
## 18       DEN          5.59        6.11           6.18        4.58
## 19     DPOEF         12.15       13.20          14.54       10.78
## 20       DIS         14.80       15.78          17.14       12.94
## 21       SGF         24.14       26.77          28.95       20.85

De igual manera tenemos los siguientes datos, que son las medias de las variables anteriormente comentadas.

Exploración de datos

La continuación de esta sección continua en el siguiente documento: continuación

Recomiendo abrir ese link en una nueva pestaña, para no anidar documentos en Rpubs Se recomienda tener conocimientos basicos sobre algunos conceptos de estadistica, se recomienda leer sobre estos temas antes de dar click en el link llamado continuación.

Si no tiene bibliografia, fuentes de consulta o desea un resumen de conceptos en estadistica, puedes consultar el siguiente documento: Estadistica conceptos

Ayuda si ves un error.

Si encuentras un error no dudes en enviar un correo con una foto de donde esta el error o una explicación a uno de los siguientes correos: