En nuestras sesiones anteriores, hemos explorado diversas estrategias para la extracción y limpieza de datos. En el día de hoy, nos sumergiremos en el uso de algunas funciones de manipulación de bases de datos utilizando la librería dplyr, aplicando así todo lo aprendido hasta el momento.
Dplyr es una herramienta imprescindible en R debido a su capacidad para simplificar y acelerar el proceso de exploración, limpieza y resumen de datos no estructurados. Su especialidad radica en su conjunto de funciones diseñadas específicamente para llevar a cabo las operaciones más comunes de manipulación de datos. Esto incluye la capacidad de filtrar datos según criterios específicos, seleccionar columnas relevantes, ordenar los datos según ciertos atributos, añadir o eliminar columnas, y realizar operaciones de agregación.
Una de las características más destacadas de dplyr es su accesibilidad y facilidad de uso. Sus funciones están diseñadas de manera intuitiva, lo que facilita su aprendizaje y aplicación. Por ejemplo, la función filter() se utiliza de manera sencilla para filtrar filas según condiciones específicas. Esta coherencia en la nomenclatura hace que sea fácil recordar y utilizar las funciones de dplyr, lo que contribuye significativamente a una mayor eficiencia en el flujo de trabajo de análisis de datos en R.
Empezamos!
library(rio)
## Warning: package 'rio' was built under R version 4.3.3
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
mydata = import("https://raw.githubusercontent.com/deepanshu88/data/master/sampledata.csv")
La función sample_n selecciona filas aleatorias de un marco de datos (o tabla). El segundo parámetro de la función indica a R el número de filas que debe seleccionar. Pidamos cinco casos de forma aleatoria:
sample_n(mydata,5)
## Index State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 S South Dakota 1159037 1150689 1660148 1417141 1418586 1279134 1171870
## 2 W Wisconsin 1788920 1518578 1289663 1436888 1251678 1721874 1980167
## 3 I Indiana 1776918 1734104 1269927 1204117 1848073 1129546 1139551
## 4 I Iowa 1499269 1444576 1576367 1388924 1554813 1452911 1317983
## 5 C Colorado 1343824 1878473 1886149 1236697 1871471 1814218 1875146
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1852424 1554782 1647245 1811156 1147488 1302834 1136443
## 2 1901394 1648755 1940943 1729177 1510119 1701650 1846238
## 3 1883976 1999102 1559924 1905760 1129794 1988394 1467614
## 4 1150783 1751389 1992996 1501879 1173694 1431705 1641866
## 5 1752387 1913275 1665877 1491604 1178355 1383978 1330736
Con la función sample_frac solicitamos un porcentaje de casos del total de la data:
sample_frac(mydata,0.1)
## Index State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 M Missouri 1221316 1858368 1773451 1573967 1374863 1486197 1735099
## 2 C California 1685349 1675807 1889570 1480280 1735069 1812546 1487315
## 3 G Georgia 1929009 1541565 1810773 1779091 1326846 1223770 1773090
## 4 V Vermont 1146902 1832249 1492704 1579265 1332048 1563537 1123567
## 5 N Nevada 1426117 1114500 1119707 1758830 1694526 1765826 1903270
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1800620 1164202 1425363 1800052 1698105 1767835 1996005
## 2 1663809 1624509 1639670 1921845 1156536 1388461 1644607
## 3 1630325 1145473 1851245 1850111 1887157 1259353 1725470
## 4 1618583 1326369 1792600 1714960 1146278 1282790 1565924
## 5 1231480 1526066 1143343 1980195 1283813 1225348 1903804
Con la función discinct eliminamos casos repetidos. Podemos hacerlo en función a una variable. Tomemos como ejemplo la variable Index. .keep_all es necesario para quedarnos con todas las columnas.
x2 = distinct(mydata, Index, .keep_all= TRUE)
table(mydata$Index)
##
## A C D F G H I K L M N O P R S T U V W
## 4 3 2 1 1 1 4 2 1 8 8 3 1 1 2 2 1 2 4
table(x2$Index)
##
## A C D F G H I K L M N O P R S T U V W
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Ya conocemos la función select:
mydata2 = select(mydata, Index, State:Y2008) #Los : para indicar un rango de columnas.
Con el signo negativo dropeamos variables:
mydata = select(mydata, -Index, -State)
Con start_with nos quedamos con las variables que empiezan con alguna letra en específico:
mydata3 = select(mydata, starts_with("Y"))
#mydata33 = select(mydata, -starts_with("Y")) Así si quisieramos dropear las que empiezan con Y.
Otras funciones para seleccionar variables:
Ejemplo rapido:
#Nos quedamos con las que acaban en 2:
mydata3 = select(mydata, ends_with("2"))
#O que contengan un elemento en específico:
mydata4 = select(mydata, contains("1"))
Cambiando nombres de variables:
mydata = import("https://raw.githubusercontent.com/deepanshu88/data/master/sampledata.csv")
names(mydata)
## [1] "Index" "State" "Y2002" "Y2003" "Y2004" "Y2005" "Y2006" "Y2007" "Y2008"
## [10] "Y2009" "Y2010" "Y2011" "Y2012" "Y2013" "Y2014" "Y2015"
mydata6 = mydata
colnames(mydata6)[1] ="Index1"
#colnames(mydata6) = c("Nombres de cada vector")
names(mydata6)
## [1] "Index1" "State" "Y2002" "Y2003" "Y2004" "Y2005" "Y2006" "Y2007"
## [9] "Y2008" "Y2009" "Y2010" "Y2011" "Y2012" "Y2013" "Y2014" "Y2015"
Con filter filtramos la base:
mydata7 = filter(mydata, Index == "A")
head(mydata7)
## Index State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 A Alabama 1296530 1317711 1118631 1492583 1107408 1440134 1945229
## 2 A Alaska 1170302 1960378 1818085 1447852 1861639 1465841 1551826
## 3 A Arizona 1742027 1968140 1377583 1782199 1102568 1109382 1752886
## 4 A Arkansas 1485531 1994927 1119299 1947979 1669191 1801213 1188104
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1944173 1237582 1440756 1186741 1852841 1558906 1916661
## 2 1436541 1629616 1230866 1512804 1985302 1580394 1979143
## 3 1554330 1300521 1130709 1907284 1363279 1525866 1647724
## 4 1628980 1669295 1928238 1216675 1591896 1360959 1329341
El operador %in% se puede utilizar para seleccionar múltiples elementos. Aquí le estamos diciendo a R que seleccione filas ‘A’ y ‘C’ en la columna ‘Índice’.
mydata7 = filter(mydata6, Index1 %in% c("A", "C"))
head(mydata7)
## Index1 State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 A Alabama 1296530 1317711 1118631 1492583 1107408 1440134 1945229
## 2 A Alaska 1170302 1960378 1818085 1447852 1861639 1465841 1551826
## 3 A Arizona 1742027 1968140 1377583 1782199 1102568 1109382 1752886
## 4 A Arkansas 1485531 1994927 1119299 1947979 1669191 1801213 1188104
## 5 C California 1685349 1675807 1889570 1480280 1735069 1812546 1487315
## 6 C Colorado 1343824 1878473 1886149 1236697 1871471 1814218 1875146
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1944173 1237582 1440756 1186741 1852841 1558906 1916661
## 2 1436541 1629616 1230866 1512804 1985302 1580394 1979143
## 3 1554330 1300521 1130709 1907284 1363279 1525866 1647724
## 4 1628980 1669295 1928238 1216675 1591896 1360959 1329341
## 5 1663809 1624509 1639670 1921845 1156536 1388461 1644607
## 6 1752387 1913275 1665877 1491604 1178355 1383978 1330736
Otra alternativa:
mydata7 = filter(mydata6, Index1 == "A" | Index1 == "C") #Recordamos EAP 1 y los operadores lógicos
head(mydata7)
## Index1 State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 A Alabama 1296530 1317711 1118631 1492583 1107408 1440134 1945229
## 2 A Alaska 1170302 1960378 1818085 1447852 1861639 1465841 1551826
## 3 A Arizona 1742027 1968140 1377583 1782199 1102568 1109382 1752886
## 4 A Arkansas 1485531 1994927 1119299 1947979 1669191 1801213 1188104
## 5 C California 1685349 1675807 1889570 1480280 1735069 1812546 1487315
## 6 C Colorado 1343824 1878473 1886149 1236697 1871471 1814218 1875146
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1944173 1237582 1440756 1186741 1852841 1558906 1916661
## 2 1436541 1629616 1230866 1512804 1985302 1580394 1979143
## 3 1554330 1300521 1130709 1907284 1363279 1525866 1647724
## 4 1628980 1669295 1928238 1216675 1591896 1360959 1329341
## 5 1663809 1624509 1639670 1921845 1156536 1388461 1644607
## 6 1752387 1913275 1665877 1491604 1178355 1383978 1330736
Podemos aplicar más condiciones en la misma línea de código. Queremos a los casos A y C en la variable Index Y a los casos mayores a 1300000 en el año 2002:
mydata8 = filter(mydata6, Index1 %in% c("A", "C") & Y2002 >= 1300000 )
head(mydata8) #Veamo:
## Index1 State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 A Arizona 1742027 1968140 1377583 1782199 1102568 1109382 1752886
## 2 A Arkansas 1485531 1994927 1119299 1947979 1669191 1801213 1188104
## 3 C California 1685349 1675807 1889570 1480280 1735069 1812546 1487315
## 4 C Colorado 1343824 1878473 1886149 1236697 1871471 1814218 1875146
## 5 C Connecticut 1610512 1232844 1181949 1518933 1841266 1976976 1764457
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1554330 1300521 1130709 1907284 1363279 1525866 1647724
## 2 1628980 1669295 1928238 1216675 1591896 1360959 1329341
## 3 1663809 1624509 1639670 1921845 1156536 1388461 1644607
## 4 1752387 1913275 1665877 1491604 1178355 1383978 1330736
## 5 1972730 1968730 1945524 1228529 1582249 1503156 1718072
Ahora queremos a los casos A y C en la variable Index O los casos mayores a 1300000 en el año 2002:
mydata9 = filter(mydata6, Index1 %in% c("A", "C") | Y2002 >= 1300000)
tail(mydata9) #Nótese que hay casos que no son ni A ni C!!
## Index1 State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 39 T Texas 1520591 1310777 1957713 1907326 1873544 1655483 1785986
## 40 U Utah 1771096 1195861 1979395 1241662 1437456 1859416 1939284
## 41 W Washington 1977749 1687136 1199490 1163092 1334864 1621989 1545621
## 42 W West Virginia 1677347 1380662 1176100 1888948 1922085 1740826 1238174
## 43 W Wisconsin 1788920 1518578 1289663 1436888 1251678 1721874 1980167
## 44 W Wyoming 1775190 1498098 1198212 1881688 1750527 1523124 1587602
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 39 1827503 1447457 1978374 1882532 1698698 1646508 1705322
## 40 1915865 1619186 1288285 1108281 1123353 1801019 1729273
## 41 1555554 1179331 1150089 1775787 1273834 1387428 1377341
## 42 1539322 1539603 1872519 1462137 1683127 1204344 1198791
## 43 1901394 1648755 1940943 1729177 1510119 1701650 1846238
## 44 1504455 1282142 1881814 1673668 1994022 1204029 1853858
Y cuando NO queremos algunos casos de la variable:
mydata10 = filter(mydata6, !Index1 %in% c("A", "C"))
head(mydata10)
## Index1 State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007
## 1 D Delaware 1330403 1268673 1706751 1403759 1441351 1300836
## 2 D District of Columbia 1111437 1993741 1374643 1827949 1803852 1595981
## 3 F Florida 1964626 1468852 1419738 1362787 1339608 1278550
## 4 G Georgia 1929009 1541565 1810773 1779091 1326846 1223770
## 5 H Hawaii 1461570 1200280 1213993 1245931 1459383 1430465
## 6 I Idaho 1353210 1438538 1739154 1541015 1122387 1772050
## Y2008 Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1762096 1553585 1370984 1318669 1984027 1671279 1803169 1627508
## 2 1193245 1739748 1707823 1353449 1979708 1912654 1782169 1410183
## 3 1756185 1818438 1198403 1497051 1131928 1107448 1407784 1170389
## 4 1773090 1630325 1145473 1851245 1850111 1887157 1259353 1725470
## 5 1919423 1928416 1330509 1902816 1695126 1517184 1948108 1150882
## 6 1335481 1748608 1436809 1456340 1643855 1312561 1713718 1757171
Vamos a utilizar la función de filtro con la función grepl para buscar a todos aquellos países que tengan “Ar” en el nombre:
mydata10 = filter(mydata6, grepl("Ar", State))
head(mydata10)
## Index1 State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 A Arizona 1742027 1968140 1377583 1782199 1102568 1109382 1752886
## 2 A Arkansas 1485531 1994927 1119299 1947979 1669191 1801213 1188104
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1554330 1300521 1130709 1907284 1363279 1525866 1647724
## 2 1628980 1669295 1928238 1216675 1591896 1360959 1329341
Ahora podemos hacer cálculos con los vectores con la función summarise:
summarise(mydata, Y2015_mean = mean(Y2015),
Y2015_med=median(Y2015))
## Y2015_mean Y2015_med
## 1 1588297 1627508
Con summarise_at podemos solicitar varias medidas de tendencia central para varias variables así:
summarise_at(mydata, vars(Y2005, Y2006), funs(n(), mean, median))
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
##
## # Simple named list: list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
##
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Y2005_n Y2006_n Y2005_mean Y2006_mean Y2005_median Y2006_median
## 1 51 51 1522064 1530969 1480280 1531641
Otra forma:
summarise_at(mydata, vars(Y2005, Y2006), list(~n(), ~mean(.), ~median(.)))
## Y2005_n Y2006_n Y2005_mean Y2006_mean Y2005_median Y2006_median
## 1 51 51 1522064 1530969 1480280 1531641
El operador pipe se utiliza en dplyr prestado de la librería magrittr y permite concatenar funciones en una línea de código:
Por ejemplo, nos vamos a quedar solo con dos variables y, sobre esa selección, sacamos una muestra de diez casos:
dt = mydata %>% select(Index, State) %>% sample_n(10)
head(dt)
## Index State
## 1 O Oregon
## 2 M Maine
## 3 A Arkansas
## 4 C California
## 5 U Utah
## 6 W Washington
Así podemos manipular de muchas formas nuestra base original sin moverla realmente. Otro ejemplo:
dt1 = mydata %>%
select(Index,Y2002,Y2008,Y2010) %>%
group_by(Index) %>%
summarise_at(vars(Y2002,Y2008,Y2010), funs(n(), mean, median)) %>%
filter(Y2002_mean >= 1501744)
## Warning: `funs()` was deprecated in dplyr 0.8.0.
## ℹ Please use a list of either functions or lambdas:
##
## # Simple named list: list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`: tibble::lst(mean, median)
##
## # Using lambdas list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
#Y así hasta el infinito
head(dt1)
## # A tibble: 6 × 10
## Index Y2002_n Y2008_n Y2010_n Y2002_mean Y2008_mean Y2010_mean Y2002_median
## <chr> <int> <int> <int> <dbl> <dbl> <dbl> <dbl>
## 1 C 3 3 3 1546562. 1708973. 1835505. 1610512
## 2 F 1 1 1 1964626 1756185 1198403 1964626
## 3 G 1 1 1 1929009 1773090 1145473 1929009
## 4 I 4 4 4 1534438. 1416165 1652330. 1503812.
## 5 K 2 2 2 1661466 1625663 1450664 1661466
## 6 L 1 1 1 1584734 1185085 1498662 1584734
## # ℹ 2 more variables: Y2008_median <dbl>, Y2010_median <dbl>
Función do(): Solicitamos algo a la data
t = mydata %>% filter(Index %in% c("A", "C","I"))
head(t)
## Index State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 A Alabama 1296530 1317711 1118631 1492583 1107408 1440134 1945229
## 2 A Alaska 1170302 1960378 1818085 1447852 1861639 1465841 1551826
## 3 A Arizona 1742027 1968140 1377583 1782199 1102568 1109382 1752886
## 4 A Arkansas 1485531 1994927 1119299 1947979 1669191 1801213 1188104
## 5 C California 1685349 1675807 1889570 1480280 1735069 1812546 1487315
## 6 C Colorado 1343824 1878473 1886149 1236697 1871471 1814218 1875146
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1944173 1237582 1440756 1186741 1852841 1558906 1916661
## 2 1436541 1629616 1230866 1512804 1985302 1580394 1979143
## 3 1554330 1300521 1130709 1907284 1363279 1525866 1647724
## 4 1628980 1669295 1928238 1216675 1591896 1360959 1329341
## 5 1663809 1624509 1639670 1921845 1156536 1388461 1644607
## 6 1752387 1913275 1665877 1491604 1178355 1383978 1330736
Le pedimos que nos dé los dos primeros casos de cada grupo:
t = mydata %>% filter(Index %in% c("A", "C","I")) %>% group_by(Index) %>%
do(head( . , 2))
head(t)
## # A tibble: 6 × 16
## # Groups: Index [3]
## Index State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008 Y2009 Y2010
## <chr> <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1 A Alabama 1.30e6 1.32e6 1.12e6 1.49e6 1.11e6 1.44e6 1.95e6 1.94e6 1.24e6
## 2 A Alaska 1.17e6 1.96e6 1.82e6 1.45e6 1.86e6 1.47e6 1.55e6 1.44e6 1.63e6
## 3 C Californ… 1.69e6 1.68e6 1.89e6 1.48e6 1.74e6 1.81e6 1.49e6 1.66e6 1.62e6
## 4 C Colorado 1.34e6 1.88e6 1.89e6 1.24e6 1.87e6 1.81e6 1.88e6 1.75e6 1.91e6
## 5 I Idaho 1.35e6 1.44e6 1.74e6 1.54e6 1.12e6 1.77e6 1.34e6 1.75e6 1.44e6
## 6 I Illinois 1.51e6 1.53e6 1.49e6 1.26e6 1.54e6 1.75e6 1.87e6 1.66e6 1.42e6
## # ℹ 5 more variables: Y2011 <int>, Y2012 <int>, Y2013 <int>, Y2014 <int>,
## # Y2015 <int>
Lo interesante es que podemos pedirle que se quede no solo con los primeros casos en términos de posición, sino también con el tercer caso más alto de la variable, por ejemplo:
t = mydata %>% select(Index, Y2015) %>% #Selecciona variables
filter(Index %in% c("A", "C","I")) %>% #Filtra por categorías
group_by(Index) %>% #Agrupa
do(arrange(.,desc(Y2015))) %>% slice(3) #Ordena y se queda con el tercer valor más alto
head(t)
## # A tibble: 3 × 2
## # Groups: Index [3]
## Index Y2015
## <chr> <int>
## 1 A 1647724
## 2 C 1330736
## 3 I 1583516
Otro ejemplo de concatenación de funciones:
t = mydata %>%
group_by(Index)%>%
summarise(Mean_2014 = mean(Y2014, na.rm=TRUE),
Mean_2015 = mean(Y2015, na.rm=TRUE)) %>%
arrange(desc(Mean_2015))
head(t)
## # A tibble: 6 × 3
## Index Mean_2014 Mean_2015
## <chr> <dbl> <dbl>
## 1 U 1801019 1729273
## 2 G 1259353 1725470
## 3 A 1506531. 1718217.
## 4 M 1596816. 1710808.
## 5 V 1494748. 1708159
## 6 P 1931500 1668232
Otro conjunto de funciones están en la librería reshape. La data con la que estamos trabajando está limpia, pero no necesariamente ordenada. Es decir, muchas veces, algunos gráficos requieren de cierto tipo de estructura de datos. Si quisieramos hacer un gráfico de líneas, en la que cada línea es un año, este tipo de esturctura de datos no nos ayudaría. Reshape nos puede ayudar con esto:
Esta es nuestra data:
head(mydata)
## Index State Y2002 Y2003 Y2004 Y2005 Y2006 Y2007 Y2008
## 1 A Alabama 1296530 1317711 1118631 1492583 1107408 1440134 1945229
## 2 A Alaska 1170302 1960378 1818085 1447852 1861639 1465841 1551826
## 3 A Arizona 1742027 1968140 1377583 1782199 1102568 1109382 1752886
## 4 A Arkansas 1485531 1994927 1119299 1947979 1669191 1801213 1188104
## 5 C California 1685349 1675807 1889570 1480280 1735069 1812546 1487315
## 6 C Colorado 1343824 1878473 1886149 1236697 1871471 1814218 1875146
## Y2009 Y2010 Y2011 Y2012 Y2013 Y2014 Y2015
## 1 1944173 1237582 1440756 1186741 1852841 1558906 1916661
## 2 1436541 1629616 1230866 1512804 1985302 1580394 1979143
## 3 1554330 1300521 1130709 1907284 1363279 1525866 1647724
## 4 1628980 1669295 1928238 1216675 1591896 1360959 1329341
## 5 1663809 1624509 1639670 1921845 1156536 1388461 1644607
## 6 1752387 1913275 1665877 1491604 1178355 1383978 1330736
library(reshape)
## Warning: package 'reshape' was built under R version 4.3.3
##
## Attaching package: 'reshape'
## The following object is masked from 'package:dplyr':
##
## rename
rdata <- melt(mydata, id=c("Index","State"))
head(rdata)
## Index State variable value
## 1 A Alabama Y2002 1296530
## 2 A Alaska Y2002 1170302
## 3 A Arizona Y2002 1742027
## 4 A Arkansas Y2002 1485531
## 5 C California Y2002 1685349
## 6 C Colorado Y2002 1343824
Podemos renombrar las columnas:
colnames(rdata)[3] = "Year"
Esa Y al inicio de cada año puede ser fastidiosa. Felizmente podemos eliminarla con subtr:
rdata$Year = substr(rdata$Year,2,8)
head(rdata)
## Index State Year value
## 1 A Alabama 2002 1296530
## 2 A Alaska 2002 1170302
## 3 A Arizona 2002 1742027
## 4 A Arkansas 2002 1485531
## 5 C California 2002 1685349
## 6 C Colorado 2002 1343824
Con esto ya podríamos graficar. Agrupemos por índice:
rdata = rdata %>%
group_by(Index,Year) %>%
summarise(MEDIA = mean(value, na.rm = T)) %>%
filter(Index %in% c("A","C"))
## `summarise()` has grouped output by 'Index'. You can override using the
## `.groups` argument.
rdata$Year = as.numeric(rdata$Year)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(rdata, aes(x = Year, y = MEDIA, colour = Index)) +
geom_line()
Cambiemos las cosas a mayúsculas:
a <- "Ya falta poco para irnos"
a
## [1] "Ya falta poco para irnos"
toupper(a)
## [1] "YA FALTA POCO PARA IRNOS"
mydata$State1 = toupper(mydata$State)
table(mydata$State1)
##
## ALABAMA ALASKA ARIZONA
## 1 1 1
## ARKANSAS CALIFORNIA COLORADO
## 1 1 1
## CONNECTICUT DELAWARE DISTRICT OF COLUMBIA
## 1 1 1
## FLORIDA GEORGIA HAWAII
## 1 1 1
## IDAHO ILLINOIS INDIANA
## 1 1 1
## IOWA KANSAS KENTUCKY
## 1 1 1
## LOUISIANA MAINE MARYLAND
## 1 1 1
## MASSACHUSETTS MICHIGAN MINNESOTA
## 1 1 1
## MISSISSIPPI MISSOURI MONTANA
## 1 1 1
## NEBRASKA NEVADA NEW HAMPSHIRE
## 1 1 1
## NEW JERSEY NEW MEXICO NEW YORK
## 1 1 1
## NORTH CAROLINA NORTH DAKOTA OHIO
## 1 1 1
## OKLAHOMA OREGON PENNSYLVANIA
## 1 1 1
## RHODE ISLAND SOUTH CAROLINA SOUTH DAKOTA
## 1 1 1
## TENNESSEE TEXAS UTAH
## 1 1 1
## VERMONT VIRGINIA WASHINGTON
## 1 1 1
## WEST VIRGINIA WISCONSIN WYOMING
## 1 1 1
Para minúsculas:
mydata$State2 = tolower(mydata$State1)
table(mydata$State2)
##
## alabama alaska arizona
## 1 1 1
## arkansas california colorado
## 1 1 1
## connecticut delaware district of columbia
## 1 1 1
## florida georgia hawaii
## 1 1 1
## idaho illinois indiana
## 1 1 1
## iowa kansas kentucky
## 1 1 1
## louisiana maine maryland
## 1 1 1
## massachusetts michigan minnesota
## 1 1 1
## mississippi missouri montana
## 1 1 1
## nebraska nevada new hampshire
## 1 1 1
## new jersey new mexico new york
## 1 1 1
## north carolina north dakota ohio
## 1 1 1
## oklahoma oregon pennsylvania
## 1 1 1
## rhode island south carolina south dakota
## 1 1 1
## tennessee texas utah
## 1 1 1
## vermont virginia washington
## 1 1 1
## west virginia wisconsin wyoming
## 1 1 1
Si queremos bajar a minúsculas desde el segundo elemento de la línea de texto:
mydata$State3=stringr::str_to_title(mydata$State1)
table(mydata$State3)
##
## Alabama Alaska Arizona
## 1 1 1
## Arkansas California Colorado
## 1 1 1
## Connecticut Delaware District Of Columbia
## 1 1 1
## Florida Georgia Hawaii
## 1 1 1
## Idaho Illinois Indiana
## 1 1 1
## Iowa Kansas Kentucky
## 1 1 1
## Louisiana Maine Maryland
## 1 1 1
## Massachusetts Michigan Minnesota
## 1 1 1
## Mississippi Missouri Montana
## 1 1 1
## Nebraska Nevada New Hampshire
## 1 1 1
## New Jersey New Mexico New York
## 1 1 1
## North Carolina North Dakota Ohio
## 1 1 1
## Oklahoma Oregon Pennsylvania
## 1 1 1
## Rhode Island South Carolina South Dakota
## 1 1 1
## Tennessee Texas Utah
## 1 1 1
## Vermont Virginia Washington
## 1 1 1
## West Virginia Wisconsin Wyoming
## 1 1 1
ERM = import("https://github.com/Alexanderbenit7/EAP2_2023-2/raw/main/data/DISTRITAL.xlsx")
UBI_JNE = import("https://github.com/Alexanderbenit7/EAP2_2023-2/raw/main/data/UBI.xlsx")
EQUIV = import("https://github.com/Alexanderbenit7/EAP2_2023-2/raw/main/data/Equivalencias.xlsx")
CEPLAN = import("https://github.com/Alexanderbenit7/EAP2_2023-2/raw/main/data/ceplan.xlsx")
## New names:
## • `` -> `...1`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
## • `` -> `...6`
## • `` -> `...7`
## • `` -> `...8`
## • `` -> `...9`
## • `` -> `...10`
## • `` -> `...11`
## • `` -> `...12`
## • `` -> `...13`
## • `` -> `...14`
## • `` -> `...15`
## • `` -> `...16`
## • `` -> `...17`
## • `` -> `...18`
## • `` -> `...19`
## • `` -> `...20`
## • `` -> `...21`
## • `` -> `...22`
## • `` -> `...23`
## • `` -> `...24`
## • `` -> `...25`
## • `` -> `...26`
## • `` -> `...27`
## • `` -> `...28`
## • `` -> `...29`
## • `` -> `...30`
## • `` -> `...31`
## • `` -> `...32`
## • `` -> `...33`
## • `` -> `...34`
## • `` -> `...35`
## • `` -> `...36`
## • `` -> `...37`
## • `` -> `...38`
## • `` -> `...39`
## • `` -> `...40`
## • `` -> `...41`
## • `` -> `...42`
## • `` -> `...43`
## • `` -> `...44`
## • `` -> `...45`
## • `` -> `...46`
## • `` -> `...47`
## • `` -> `...48`
Sacamos el ausentismo a nivel distrital:
AUSEN = select(ERM, c(1:3,5,12))
AUSEN$AUSENTISMO = 1-AUSEN$`% Participación`
Preparemos los ubigeos de RENIEC y agregamos:
UBI_JNE$UNIF = paste0(UBI_JNE$REGION,UBI_JNE$PROVINCIA,UBI_JNE$DISTRITO)
UBI_JNE = select(UBI_JNE, c(1,12))
Agregamos vector de unificación en la base de ausentismo:
AUSEN$UNIF = paste0(AUSEN$Region, AUSEN$Provincia, AUSEN$Distrito)
AUSEN = select(AUSEN, c(1:3,5:7))
Juntamos información:
AUSEN = merge(AUSEN, UBI_JNE, by = "UNIF", all.x = T)
AUSEN = select(AUSEN, -c(1))
#Lo que perdimos:
sum(is.na(AUSEN$UBIGEO))
## [1] 629
perdidos = AUSEN[is.na(AUSEN$UBIGEO),]
table(perdidos$Distrito)
##
## ALEXANDER VON HUMBOLDT ANCHIHUAY
## 12 10
## ANDAYMARCA ANDRES AVELINO CACERES DORREGARAY
## 7 27
## CANAYRE CASTILLO GRANDE
## 17 16
## CHACA CHANGUILLO
## 5 22
## CONSTITUCION COSME
## 27 15
## CUENCA EL INGENIO
## 18 19
## EL PORVENIR IHUAYLLO
## 6 13
## INKAWASI JOSE MARIA ARGUEDAS
## 7 6
## LA MORADA LA YARADA LOS PALOS
## 10 10
## LOS CHANKAS MARCONA
## 6 21
## MEGANTONI MI PERU
## 6 13
## NESHUYA ORONCCOY
## 14 7
## PAMPAS PICHOS
## 21 5
## PUCACOLPA PUCAYACU
## 9 10
## PUEBLO NUEVO QUICHUAS
## 12 8
## ROBLE ROCCHACC
## 5 5
## ROSA PANDURO SAMUGARI
## 8 17
## SAN MIGUEL SAN PABLO DE PILLAO
## 14 10
## SAN PEDRO DE CASTA SAN PEDRO DE LARAOS
## 36 4
## SANTA ROSA DE ALTO YANAJANCA SANTIAGO DE TUCUMA
## 9 5
## SANTO DOMINGO DE ANDA TENIENTE MANUEL CLAVERO
## 11 8
## UCHURACCAY VEINTISEIS DE OCTUBRE
## 9 39
## VILLA KINTIARINA VILLA VIRGEN
## 6 8
## VISTA ALEGRE VIZCATAN DEL ENE
## 20 12
## YACUS YAGUAS
## 17 7
ERM= ERM[complete.cases(ERM$`Tipo Organización Política`),] #Para solo quedarnos con org. políticas
Se gana con mayoría simple, así que nos quedamos con el valor más alto:
GANADOR = ERM %>%
filter(YEAR == 2018) %>%
group_by(Region,Provincia,Distrito) %>%
summarise(Ganador = max(`% Votos`, na.rm = T))
## `summarise()` has grouped output by 'Region', 'Provincia'. You can override
## using the `.groups` argument.
Agregamos UBIGEO:
GANADOR$UNIF = paste0(GANADOR$Region,GANADOR$Provincia, GANADOR$Distrito)
GANADOR = merge(GANADOR, UBI_JNE, by = "UNIF", all.x = T)
GANADOR = select(GANADOR, c(5:6))
La función do() es muy relevante:
SEGUNDO = ERM %>%
filter(YEAR == 2018) %>%
group_by(Region,Provincia,Distrito) %>%
do(arrange(.,desc(`% Votos`))) %>% slice(2)
Seleccionamos las variables de interés:
SEGUNDO$UNIF = paste0(SEGUNDO$Region, SEGUNDO$Provincia, SEGUNDO$Distrito)
SEGUNDO = merge(SEGUNDO, UBI_JNE, by = "UNIF", all.x = T)
SEGUNDO= select(SEGUNDO, c(12,14))
colnames(SEGUNDO) = c("Segundo","UBIGEO")
AUSEN = filter(AUSEN,YEAR == 2018)
AUSEN=AUSEN[!duplicated(AUSEN), ]
FINAL_DATA = merge(AUSEN, GANADOR, by = "UBIGEO")
FINAL_DATA = merge(FINAL_DATA, SEGUNDO, by = "UBIGEO")
FINAL_DATA = FINAL_DATA[complete.cases(FINAL_DATA$UBIGEO),]
Juntamos UBIGEO INEI:
EQUIV = select(EQUIV, c(1,2))
FINAL_DATA = merge(FINAL_DATA, EQUIV, by.x = "UBIGEO", by.y = "UBIGEO_RENIEC")
Agregamos data de CEPLAN:
FINAL_DATA = merge(FINAL_DATA, CEPLAN, by.x = "UBIGEO_INEI", by.y = "UBIGEO")
Agregamos el nivel de competitividad:
FINAL_DATA$COMPETITIVIDAD = FINAL_DATA$Ganador-FINAL_DATA$Segundo
FINAL_DATA$REG=stringr::str_to_title(FINAL_DATA$Region)
FINAL_DATA$PROV=stringr::str_to_title(FINAL_DATA$Provincia)
FINAL_DATA$DIST=stringr::str_to_title(FINAL_DATA$Distrito)
Data final:
FINAL_DATA = select(FINAL_DATA, c(1,14:16,7,10:13)) %>%
filter(COMPETITIVIDAD>=0)
head(FINAL_DATA)
## UBIGEO_INEI REG PROV DIST AUSENTISMO IDH_2019 %POBREZA
## 1 010102 Amazonas Chachapoyas Asuncion 0.07291667 0.4230319 36.51995
## 2 010103 Amazonas Chachapoyas Balsas 0.21047431 0.3153084 45.73296
## 3 010104 Amazonas Chachapoyas Cheto 0.12234043 0.3457458 39.16978
## 4 010105 Amazonas Chachapoyas Chiliquin 0.21617852 0.2750378 53.04566
## 5 010106 Amazonas Chachapoyas Chuquibamba 0.28255034 0.2692697 51.60783
## 6 010107 Amazonas Chachapoyas Granada 0.14251781 0.3580015 43.86596
## %POBREZAEXT COMPETITIVIDAD
## 1 15.680750 0.15612
## 2 15.427120 0.12449
## 3 23.678410 0.06222
## 4 36.395370 0.11909
## 5 43.788830 0.09100
## 6 5.943345 0.01776
Y ya para irnos:
sub_data = select(FINAL_DATA, c(5:9))
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
chart.Correlation(sub_data)
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter