Manipulación de datos en R (forma simple)

Librería utilizada y carga de datos

#install.packages("dplyr") # Instalar de manipulación de dataframes "dplyr"
library(dplyr) # Cargar la librería de manipulación de dataframes "dplyr"

nombre <- c("A","B","C","D","E","F","G","H","I","J")
sexo <- c(rep("man",5),rep("woman",5))
edad <- c (25,14,25,76,12,90,65,45,56,43)
pais <- c(rep("spain",3),rep("italy",3),rep("portugal",4))

datos <- data.frame(nombre=nombre,sexo=sexo,edad=edad,pais=pais)
head(datos)
##   nombre  sexo edad  pais
## 1      A   man   25 spain
## 2      B   man   14 spain
## 3      C   man   25 spain
## 4      D   man   76 italy
## 5      E   man   12 italy
## 6      F woman   90 italy

Filtrar de datos por filas

Forma simple

filter(datos, sexo == "man", pais == "spain")
##   nombre sexo edad  pais
## 1      A  man   25 spain
## 2      B  man   14 spain
## 3      C  man   25 spain

Forma farragosa

datos[datos$sexo == "man" & datos$pais == "spain", ]
##   nombre sexo edad  pais
## 1      A  man   25 spain
## 2      B  man   14 spain
## 3      C  man   25 spain

Borrar filas con valores nulos

datos <- na.omit(datos)

Ordenar datos por filas

Ordenar de forma ascendente

arrange(datos, edad, nombre )
##    nombre  sexo edad     pais
## 1       E   man   12    italy
## 2       B   man   14    spain
## 3       A   man   25    spain
## 4       C   man   25    spain
## 5       J woman   43 portugal
## 6       H woman   45 portugal
## 7       I woman   56 portugal
## 8       G woman   65 portugal
## 9       D   man   76    italy
## 10      F woman   90    italy

Ordenar de forma descendente

arrange(datos, desc(edad), nombre )
##    nombre  sexo edad     pais
## 1       F woman   90    italy
## 2       D   man   76    italy
## 3       G woman   65 portugal
## 4       I woman   56 portugal
## 5       H woman   45 portugal
## 6       J woman   43 portugal
## 7       A   man   25    spain
## 8       C   man   25    spain
## 9       B   man   14    spain
## 10      E   man   12    italy

Seleccionar por columnas

Seleccionar ciertas columnas concreto

select(datos, nombre, edad, pais)
##    nombre edad     pais
## 1       A   25    spain
## 2       B   14    spain
## 3       C   25    spain
## 4       D   76    italy
## 5       E   12    italy
## 6       F   90    italy
## 7       G   65 portugal
## 8       H   45 portugal
## 9       I   56 portugal
## 10      J   43 portugal

Seleccionar un rango de columnas

select(datos, nombre:edad)
##    nombre  sexo edad
## 1       A   man   25
## 2       B   man   14
## 3       C   man   25
## 4       D   man   76
## 5       E   man   12
## 6       F woman   90
## 7       G woman   65
## 8       H woman   45
## 9       I woman   56
## 10      J woman   43

Excluir un rango de columnas

select(datos, -(nombre:edad))
##        pais
## 1     spain
## 2     spain
## 3     spain
## 4     italy
## 5     italy
## 6     italy
## 7  portugal
## 8  portugal
## 9  portugal
## 10 portugal

Seleccionar ciertas columnas y renombrarlas

select(datos, new.nombre= nombre, new.edad = edad)
##    new.nombre new.edad
## 1           A       25
## 2           B       14
## 3           C       25
## 4           D       76
## 5           E       12
## 6           F       90
## 7           G       65
## 8           H       45
## 9           I       56
## 10          J       43

Renombrar columnas

Renombrar columnas de forma simple

rename(datos, new.nombre= nombre, new.edad = edad)
##    new.nombre  sexo new.edad     pais
## 1           A   man       25    spain
## 2           B   man       14    spain
## 3           C   man       25    spain
## 4           D   man       76    italy
## 5           E   man       12    italy
## 6           F woman       90    italy
## 7           G woman       65 portugal
## 8           H woman       45 portugal
## 9           I woman       56 portugal
## 10          J woman       43 portugal

Seleccionar ciertas columnas y renombrarlas

select(datos, new.nombre= nombre, new.edad = edad)
##    new.nombre new.edad
## 1           A       25
## 2           B       14
## 3           C       25
## 4           D       76
## 5           E       12
## 6           F       90
## 7           G       65
## 8           H       45
## 9           I       56
## 10          J       43

Seleccionar y quedarse con las filas de valores no repetidos (unique)

distinct(datos, pais)
##       pais
## 1    spain
## 2    italy
## 3 portugal
distinct(datos, sexo, pais)
##    sexo     pais
## 1   man    spain
## 2   man    italy
## 3 woman    italy
## 4 woman portugal

Insertar nuevas columnas

Insertar nuevas columnas a las ya existentes

mutate(datos, 
       nacimiento = 2017 - edad
      )
##    nombre  sexo edad     pais nacimiento
## 1       A   man   25    spain       1992
## 2       B   man   14    spain       2003
## 3       C   man   25    spain       1992
## 4       D   man   76    italy       1941
## 5       E   man   12    italy       2005
## 6       F woman   90    italy       1927
## 7       G woman   65 portugal       1952
## 8       H woman   45 portugal       1972
## 9       I woman   56 portugal       1961
## 10      J woman   43 portugal       1974

Crear un nuevo dataframe con las columnas nuevas

transmute(datos, 
          nacimiento = 2017 - edad,
          new.pais = paste("my county is ", pais) 
        )
##    nacimiento               new.pais
## 1        1992    my county is  spain
## 2        2003    my county is  spain
## 3        1992    my county is  spain
## 4        1941    my county is  italy
## 5        2005    my county is  italy
## 6        1927    my county is  italy
## 7        1952 my county is  portugal
## 8        1972 my county is  portugal
## 9        1961 my county is  portugal
## 10       1974 my county is  portugal

Resumir la información

summarise(datos,
  delay = mean(edad, na.rm = TRUE)
  )
##   delay
## 1  45.1

Agrupar información por sus variables

Agrupar datos por sexo

grupos <- group_by(datos, sexo)
summarise(grupos,
  num = n()
)
## # A tibble: 2 × 2
##     sexo   num
##   <fctr> <int>
## 1    man     5
## 2  woman     5

Agrupar datos por sexo determinando cuantos países hay distintos de cada grupo

summarise(grupos,
  paises = n_distinct(pais),
  num = n()
)
## # A tibble: 2 × 3
##     sexo paises   num
##   <fctr>  <int> <int>
## 1    man      2     5
## 2  woman      2     5

Agrupar por sexo y mostrar el primer país de cada grupo

summarise(grupos,
  pais1 = first(pais),
  num = n()
)
## # A tibble: 2 × 3
##     sexo  pais1   num
##   <fctr> <fctr> <int>
## 1    man  spain     5
## 2  woman  italy     5

Agrupar por sexo y mostrar el último país de cada grupo

summarise(grupos,
  paisN = last(pais),
  num = n()
)
## # A tibble: 2 × 3
##     sexo    paisN   num
##   <fctr>   <fctr> <int>
## 1    man    italy     5
## 2  woman portugal     5

Agrupar por sexo y mostrar el N país de cada grupo

summarise(grupos,
  pais2 = nth(pais,2),
  num = n()
)
## # A tibble: 2 × 3
##     sexo    pais2   num
##   <fctr>   <fctr> <int>
## 1    man    spain     5
## 2  woman portugal     5

Agrupación de sentencias que manipulan datos

Mediante variables

a1 <- group_by(datos, pais)
a2 <- select(a1, sexo:pais)
a3 <- summarise(a2, media.edad = mean(edad, na.rm = TRUE))
a4 <- filter(a3, media.edad > 25 & media.edad < 80)

Mediante llaves donde unas sentencias incluyan a otras

filter(
  summarise(
    select(
      group_by(datos, pais),
      sexo:pais
    ),
    media.edad = mean(edad, na.rm = TRUE)
  ),
  media.edad > 25 & media.edad < 80
)
## # A tibble: 2 × 2
##       pais media.edad
##     <fctr>      <dbl>
## 1    italy   59.33333
## 2 portugal   52.25000

Mediante el operador %>%

datos %>%
  group_by(pais) %>%
  select(sexo:pais) %>%
  summarise(media.edad = mean(edad, na.rm = TRUE)) %>%
  filter (media.edad > 25 & media.edad < 80)
## # A tibble: 2 × 2
##       pais media.edad
##     <fctr>      <dbl>
## 1    italy   59.33333
## 2 portugal   52.25000

Unión de dos tablas

id <- c (1:10)
valor1 <- c("A","B","C","D","E","F","G","H","I","J")
valor2 <- c(rep("spain",3),rep("italy",3),rep("portugal",4))

datos1 <- data.frame(id=id,valor1= valor1)
datos2 <- data.frame(id=id,valor2= valor2)
head(datos1)
head(datos2)

#install.packages("nycflights13")
library("nycflights13")

join <- datos1 %>% left_join(datos2, by="id")
head(join)

#  id valor1 valor2
#  1      A  spain
#  2      B  spain
#  3      C  spain
#  4      D  italy
#  5      E  italy
#  6      F  italy

 

Seleccionar los n primeros valores

nombre <- c("A","B","C","D","E","F","G","H","I","J")
sexo <- c(rep("man",5),rep("woman",5))
datos <- data.frame(nombre=nombre,sexo=sexo)

datos %>% filter(row_number() <= 3) 

Reemplazar valores de una columna

nombre <- c("A","B","C","D","E","F","G","H","I","J")
valor <- c("X", 2, 3, NA, NA, NA, 3, 2, 1, 0)
datos <- data.frame(nombre,valor)

# Reemplazar NA
datos <- datos %>% mutate(valor = replace(valor, which(is.na(valor)), 0))

# Reemplazar cadenas de caracteres por nunero
datos <- datos %>% mutate(valor = replace(valor, valor == "X", 0))

# Reemplazar cadenas de caracteres por otra
levels(datos$valor) <- c(levels(datos$valor),"Nueva")
datos <- datos %>% mutate(valor = replace(valor, valor == "X", "Nueva"))

Nota: Si existien problemas de compatibilidad con el paquete «plyr» ejecutar el siguiente comando:

Error: This function should not be called directly
Solución: detach("package:plyr", unload=TRUE)