Manipulación de datos en R (forma simple)

por | Feb 17, 2017 | R | 9 Comentarios

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) 

9 Comentarios

  1. Mario Huerto

    Información muy importante, sirve de mucho para procesar datos.
    Gracias.

    Responder
  2. miguel martinez

    buenos ejemplos

    Responder
  3. I

    Hola, estoy intentando encontrar una función que me permita cambiar el nombre de un directorio usando R. ¿Puedes orientarme?

    Muchas gracias

    Responder
    • Samir Ricardo Neme

      Buenos días, tengo un df con una serie de filas con caracteres de respuestas tipo likert. «Totalmente de acuerdo», «En acuerdo», ni en acuerdo ni en desacuerdo», «en desacuerdo», «Totalmente en desacuerdo».

      Quiera remplazar los caracteres por 6, 5, 4, 3, 2, 1.

      Use la función: datos % mutate(valor = replace(valor, valor == «X», 0))

      Pero esto solo permitió remplazar un solo valor, trate de usar la función varias veces pero no obtuve el resultado deseado remplazando los 6 valores

      ¿Es posible hacer el remplazo de todos los valores? Y que quede correcto

      Muchas gracias por su ayuda

      Responder
  4. Agustina

    Muchas gracias por el blog, muy interesante.
    Estoy buscando dividir el texto de una columna por determinado caracter, en el caso particular el caracter es: «|»
    Los valores de la columna son:
    a|b|c
    Busco dividir en varias columnas por el caracter «|»
    ¿Sabes si es posible?

    Responder
  5. Jhons

    Hola,
    gracias por los ejemplos.
    Si me podria ayudar con reemplazar varios valores de una misma columna.
    tengo mas de 500000 filas en 22 grupos codificados en numeros (ej. c(9941,9945, 9950, …)), entonces quisiera a esos valores numericos reemplazarlos a letras (ej, AAA, BBB, CCC, ….). he estado probando sus ejemplo pero no me sale.
    Muchas gracias de antemano.

    Responder
  6. Maximiliano

    Buenas!! Van mis consultas de Dummies 🙂

    Tengo una base que en una de sus columnas tiene DNIs. He identificado errores y quisiera modificarlos con un script de R. Como puedo hacer un replace masivo?

    En este ejemplo se remplaza X por 0

    datos % mutate(valor = replace(valor, valor == «X», 0))

    pero si quisiera replazar 100 DNIs por otros 100 como se podria hacer?

    Espero que puedan ayudarme

    Abrazo

    Responder
  7. Juan Tena

    Buenas tardes Diego. Estoy tratando de resolver un problema y no doy bien con las instrucciones. Basicamnete si tengo un data.frame de este tipo
    A, B. C, D, E
    A, B. C, D, F
    A, B. C, D, G
    ….
    V, W, X, Y, Z
    y la pareja de valores A, G
    como puedo quitar o marcar las filas que tengan esos dos valores?
    Gracias

    Responder
  8. Juan Carlos

    Hola, Diego! Y si quieséramos seleccionar las filas en las que todos sus valores son iguales a x? Por ejemplo: seleccionar las filas en las que todos sus valores son iguales a 0. Cómo podríamos hacerlo?

    Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada.