¿Cómo Filtrar una base en R usando dplyr?

Formas sencillas de filtrar una base o tabla en R

Juguemos con la data de Gapminder - Usamos la función import del paquete rio llamamos a la data.

library(rio)
data<-import("https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv")

Demos un vistazo a la data usando head()

head(data, 10)
##        country year      pop continent lifeExp gdpPercap
## 1  Afghanistan 1952  8425333      Asia  28.801  779.4453
## 2  Afghanistan 1957  9240934      Asia  30.332  820.8530
## 3  Afghanistan 1962 10267083      Asia  31.997  853.1007
## 4  Afghanistan 1967 11537966      Asia  34.020  836.1971
## 5  Afghanistan 1972 13079460      Asia  36.088  739.9811
## 6  Afghanistan 1977 14880372      Asia  38.438  786.1134
## 7  Afghanistan 1982 12881816      Asia  39.854  978.0114
## 8  Afghanistan 1987 13867957      Asia  40.822  852.3959
## 9  Afghanistan 1992 16317921      Asia  41.674  649.3414
## 10 Afghanistan 1997 22227415      Asia  41.763  635.3414

Empecemos a filtrar.

  • Queremos tener la información solo sobre el continente Americano

    • Primero veamos que continentes están incluidos en la data
table(data$continent)
## 
##   Africa Americas     Asia   Europe  Oceania 
##      624      300      396      360       24

Nos quedaremo con “Americas”

  • 1) Método tradicional. Usando las dimensiones de la data. La data tiene dos dimensiones filas y columnas. Podemos filtrar las “filas”
data1= data[data$continent=="Americas",]
  • Es clave entender que los corchetes y las comas me permiten identificar las dimensiones. [ filas, columnas ]
  • En este caso he creado un nuevo objeto filtrando las filas que coinciden con mi criterio.
table(data1$continent)
## 
## Americas 
##      300
  • Ahora usando la función filter de Dplyr.
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
data1<-data%>%filter(continent=="Americas")
table(data1$continent)
## 
## Americas 
##      300
  • Tener en cuenta: dplyr usa el %>% que es como decir “lo de la izquierda tiralo hacia la derecha”.

  • Mira este gif que lo explica con Mario Bros

Aquí

¿Cuál es la ventaja de Dplyr?

Que con dplyr puedes armar filtros más complejos en una misma línea sin que el código se complique mucho.

Por ejemplo, si queremos filtrar los países de America, pero que tengan una pbi per capita mayor a 700, y solo necesitamos datos del 2000 hacia adelante el código usando las dimensiones de la data sería muy emarañado/confuso.

data1= data[data$continent=="Americas"&data$gdpPercap>700&data$year>2000,]
head(data1)
##       country year       pop continent lifeExp gdpPercap
## 59  Argentina 2002  38331121  Americas  74.340  8797.641
## 60  Argentina 2007  40301927  Americas  75.320 12779.380
## 143   Bolivia 2002   8445134  Americas  63.883  3413.263
## 144   Bolivia 2007   9119152  Americas  65.554  3822.137
## 179    Brazil 2002 179914212  Americas  71.006  8131.213
## 180    Brazil 2007 190010647  Americas  72.390  9065.801

Con Dplyr

data1=data%>%filter(continent=="Americas",gdpPercap>700,year>2000)
head(data1)
##     country year       pop continent lifeExp gdpPercap
## 1 Argentina 2002  38331121  Americas  74.340  8797.641
## 2 Argentina 2007  40301927  Americas  75.320 12779.380
## 3   Bolivia 2002   8445134  Americas  63.883  3413.263
## 4   Bolivia 2007   9119152  Americas  65.554  3822.137
## 5    Brazil 2002 179914212  Americas  71.006  8131.213
## 6    Brazil 2007 190010647  Americas  72.390  9065.801

Además lo interesante de Dplyr es que te permite conectar funciones. Lo que hace el código más eficiente. Por ejemplo, quiero hacer una regresión pero usando los casos filtrados en el paso anterior, con dplyr no necesito crear ningún objeto nuevo.

data%>%filter(continent=="Americas",gdpPercap>700,year>2000)%>%
  lm(lifeExp~gdpPercap, data=.)%>%summary()
## 
## Call:
## lm(formula = lifeExp ~ gdpPercap, data = .)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.2846  -1.2025   0.1773   2.4929   5.9131 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 7.005e+01  7.970e-01  87.891  < 2e-16 ***
## gdpPercap   2.922e-04  5.829e-05   5.013 7.71e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.778 on 48 degrees of freedom
## Multiple R-squared:  0.3436,	Adjusted R-squared:   0.33 
## F-statistic: 25.13 on 1 and 48 DF,  p-value: 7.714e-06
Avatar
José Incio
Ph.D. Candidate Political Science

My research interests include subnational politics, democracy, representation and political methodology.