Este es un documento de consulta hecho para ayudarte a poder recuperar conocimiento de manera rapida, esta hecho para ti y pensando en ti.
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”
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
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().
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.
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
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
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”.
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.
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
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’.
Para continuar se usara los siguientes datos
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.
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.
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
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: