Skip to content

Instantly share code, notes, and snippets.

@jspaezp
Created September 1, 2016 15:10
Show Gist options
  • Save jspaezp/90b11155371ea6542ee68f8d10ca1fe2 to your computer and use it in GitHub Desktop.
Save jspaezp/90b11155371ea6542ee68f8d10ca1fe2 to your computer and use it in GitHub Desktop.

Colormerge

require(dplyr)
## Loading required package: 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
require(tidyr)
## Loading required package: tidyr
#### NOTA
#### en caso de que no hayas visto el %>% antes, 
#### solo hace que el codigo se lea de izquierda a derecha 
#### y no de adentro hacia afuera, es decir
#### algo %>% funcion1() %>% funcion2(argumento2) %>% funcion3
#### equivale a ...
#### funcion3(funcion2(funcion1(algo), argumento2))



###### reproducir el problema
# creamos el data frame para poder hacer el ejemplo
objetoInicial <- data_frame(
    name = c("Sceloporus acanthinus", "Otro Nombre", "UnNombre Mas"),
    longitude = c(-91.53613 , -93.47200 , -93.71400),
    latitude = c(14.53438, 15.98500, 16.21800),
    date = c(2005-06-23, 2003-03-20, 2003-03-05),
    key = c(208042516, 371129066, 371128583),
    coloresMalAlineados = c("darkorchid3", "darkorchid3", "black")
)

objetoInicial <- objetoInicial %>% sample_frac(3, replace = TRUE)

# Y asi es como se debe ver tu data frame (mas o menos ...)
objetoInicial
## # A tibble: 9 × 6
##                    name longitude latitude  date       key
##                   <chr>     <dbl>    <dbl> <dbl>     <dbl>
## 1 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 2          UnNombre Mas -93.71400 16.21800  1995 371128583
## 3           Otro Nombre -93.47200 15.98500  1980 371129066
## 4           Otro Nombre -93.47200 15.98500  1980 371129066
## 5           Otro Nombre -93.47200 15.98500  1980 371129066
## 6 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 7 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 8 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 9 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## # ... with 1 more variables: coloresMalAlineados <chr>
# creamos la lista de colores (tecnicamente vector ..)

colores <-c('red', 'yellow', 'brown', 
            'navy', 'black', 'darkorange',
            'gray','darkolivegreen1', 'deeppink1', 
            'forestgreen','violet', 'darkgoldenrod1',
            'darkorchid3', 'sienna2', 'tan1', 
            'gray96')

###### SOLUCION
# Y AHORA creamos un data frame de referencia para agregar los colores

frameDeColores <- objetoInicial %>% 
    select(name) %>% # extraemos solo la columna de nombres
    unique() %>% # retiramos los repetidos
    mutate(color = sample(colores, 
        size = n()   # numero de elementos
        )
    )

# lo que nos da un data frame asi ...
#  solo nombres y colores, nombres no repetidos, colores no repetidos

frameDeColores
## # A tibble: 3 × 2
##                    name  color
##                   <chr>  <chr>
## 1 Sceloporus acanthinus yellow
## 2          UnNombre Mas violet
## 3           Otro Nombre  brown
# y despues solo hacemos la union de los datos con left_join (dplyr)

objetofinal <- left_join(objetoInicial, 
                         frameDeColores,
                         by = "name")
objetofinal
## # A tibble: 9 × 7
##                    name longitude latitude  date       key
##                   <chr>     <dbl>    <dbl> <dbl>     <dbl>
## 1 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 2          UnNombre Mas -93.71400 16.21800  1995 371128583
## 3           Otro Nombre -93.47200 15.98500  1980 371129066
## 4           Otro Nombre -93.47200 15.98500  1980 371129066
## 5           Otro Nombre -93.47200 15.98500  1980 371129066
## 6 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 7 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 8 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## 9 Sceloporus acanthinus -91.53613 14.53438  1976 208042516
## # ... with 2 more variables: coloresMalAlineados <chr>, color <chr>
---
title: "Colormerge"
output:
html_document:
keep_md: yes
---
```{r}
require(dplyr)
require(tidyr)
#### NOTA
#### en caso de que no hayas visto el %>% antes,
#### solo hace que el codigo se lea de izquierda a derecha
#### y no de adentro hacia afuera, es decir
#### algo %>% funcion1() %>% funcion2(argumento2) %>% funcion3
#### equivale a ...
#### funcion3(funcion2(funcion1(algo), argumento2))
###### reproducir el problema
# creamos el data frame para poder hacer el ejemplo
objetoInicial <- data_frame(
name = c("Sceloporus acanthinus", "Otro Nombre", "UnNombre Mas"),
longitude = c(-91.53613 , -93.47200 , -93.71400),
latitude = c(14.53438, 15.98500, 16.21800),
date = c(2005-06-23, 2003-03-20, 2003-03-05),
key = c(208042516, 371129066, 371128583),
coloresMalAlineados = c("darkorchid3", "darkorchid3", "black")
)
objetoInicial <- objetoInicial %>% sample_frac(3, replace = TRUE)
# Y asi es como se debe ver tu data frame (mas o menos ...)
objetoInicial
# creamos la lista de colores (tecnicamente vector ..)
colores <-c('red', 'yellow', 'brown',
'navy', 'black', 'darkorange',
'gray','darkolivegreen1', 'deeppink1',
'forestgreen','violet', 'darkgoldenrod1',
'darkorchid3', 'sienna2', 'tan1',
'gray96')
###### SOLUCION
# Y AHORA creamos un data frame de referencia para agregar los colores
frameDeColores <- objetoInicial %>%
select(name) %>% # extraemos solo la columna de nombres
unique() %>% # retiramos los repetidos
mutate(color = sample(colores,
size = n() # numero de elementos
)
)
# lo que nos da un data frame asi ...
# solo nombres y colores, nombres no repetidos, colores no repetidos
frameDeColores
# y despues solo hacemos la union de los datos con left_join (dplyr)
objetofinal <- left_join(objetoInicial,
frameDeColores,
by = "name")
objetofinal
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment