2016-12-31

Muestra aleatoria de un data frame basada en una condición en R

Title

Problema

Deseamos extraer una muestra aleatoria de filas de un data frame basada en una condición en R. En nuestro ejemplo una muestra aleatoria del data frame iris que no contenga filas de la especie Setosa.

Solución

  • Paquete base
  • set.seed(12)
    iris[sample(which(iris$Species != "setosa"), 2), ]
    
       Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    57           6.3         3.3          4.7         1.6 versicolor
    131          7.4         2.8          6.1         1.9  virginica
    
  • Paquete dplyr
  • library(dplyr)
    set.seed(12)
    filter(iris, Species != "setosa") %>% sample_n(., 2) 
    
       Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    7           6.3         3.3          4.7         1.6 versicolor
    81          7.4         2.8          6.1         1.9  virginica
    

    Entradas relacionadas

    Referencias

    2016-12-19

    Reordenar el resto columnas de un data frame con dplyr

    Title

    Problema

    Cuando seleccionamos columnas usando el paquete dplyr, queremos organizar el resto de columnas al principio o el final del data frame, sin tener que escribir sus nombres manualmente.

    En el siguiente ejemplo, el data frame flights tiene 19 columnas y queremos ordenar 5 de ellas al comienzo o al final del mismo.

    library(nycflights13)
    library(dplyr)
    head(flights)
    
    # A tibble: 6 × 19
       year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
                                         
    1  2013     1     1      517            515         2      830            819
    2  2013     1     1      533            529         4      850            830
    3  2013     1     1      542            540         2      923            850
    4  2013     1     1      544            545        -1     1004           1022
    5  2013     1     1      554            600        -6      812            837
    6  2013     1     1      554            558        -4      740            728
    # ... with 11 more variables: arr_delay , carrier , flight ,
    #   tailnum , origin , dest , air_time , distance ,
    #   hour , minute , time_hour 
    

    Solución

  • Las 5 columnas al inicio del data frame
  • col <- c("carrier", "tailnum", "year", "month", "day")
    select(flights, one_of(col), everything())
    
    # A tibble: 336,776 × 19
       carrier tailnum  year month   day dep_time sched_dep_time dep_delay arr_time
                                      
    1       UA  N14228  2013     1     1      517            515         2      830
    2       UA  N24211  2013     1     1      533            529         4      850
    3       AA  N619AA  2013     1     1      542            540         2      923
    4       B6  N804JB  2013     1     1      544            545        -1     1004
    5       DL  N668DN  2013     1     1      554            600        -6      812
    6       UA  N39463  2013     1     1      554            558        -4      740
    7       B6  N516JB  2013     1     1      555            600        -5      913
    8       EV  N829AS  2013     1     1      557            600        -3      709
    9       B6  N593JB  2013     1     1      557            600        -3      838
    10      AA  N3ALAA  2013     1     1      558            600        -2      753
    # ... with 336,766 more rows, and 10 more variables: sched_arr_time ,
    #   arr_delay , flight , origin , dest , air_time ,
    #   distance , hour , minute , time_hour 
    
  • Las 5 columnas al final del data frame
  • select(flights, -one_of(col), one_of(col))
    
    # A tibble: 336,776 × 19
       dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay flight
                                              
    1       517            515         2      830            819        11   1545
    2       533            529         4      850            830        20   1714
    3       542            540         2      923            850        33   1141
    4       544            545        -1     1004           1022       -18    725
    5       554            600        -6      812            837       -25    461
    6       554            558        -4      740            728        12   1696
    7       555            600        -5      913            854        19    507
    8       557            600        -3      709            723       -14   5708
    9       557            600        -3      838            846        -8     79
    10      558            600        -2      753            745         8    301
    # ... with 336,766 more rows, and 12 more variables: origin , dest ,
    #   air_time , distance , hour , minute , time_hour ,
    #   carrier , tailnum , year , month , day 
    

  • Para añadir las columnas a todo el data frame
  • Si quisiéramos añadir las 5 columnas, duplicándolas, a la totalidad del data frame embp.

    # 5 columnas al principio
    bind_cols(select(flights, one_of(col)), flights)
    
      # Con dplyr::relocate()
      flights %>%  
        relocate(carrier, tailnum, year, month, day) 
    
    # 5 columnas al final
    bind_cols(flights, select(flights, one_of(col)))
    
      # Con dplyr::relocate()
      flights %>%  
        relocate(carrier, tailnum, year, month, day, .after = last_col()) 
    

    Entradas relacionadas

    Referencias

    2016-12-14

    Desactivar autoajustar anchos de columnas al actualizar tablas dinámicas con VBA

    Title

    Problema

    Por defecto al crear una tabla dinámica, Excel actualizará automáticamente el ancho las columnas de la tabla dinámica al tamaño del texto o valor de número más extenso. En lugar de desactivar esta opción manualmente como en la entrada anterior para cada una de las tablas dinámicas, queremos hacerlo automáticamente mediante VBA

    Solución

    Para desactivar esta opción en todas las tablas dinámicas de la hoja activa.

    1. Abrimos el Editor de Microsoft Visual Basic: Alt+F11.
    2. Copiamos una de las subrutinas de más abajo en un módulo.
      • Tablas en la hoja activa
      • Sub Desactivar_Autoajustar()
        For Each pt In ActiveSheet.PivotTables
            pt.HasAutoFormat = False
        Next
        End Sub
        
      • Todas las tablas del libro de Excel
      • Sub Desactivar_Autoajustar2()
        Dim n As Integer
        Dim i As Integer
        Dim pt As PivotTable
        n = ActiveWorkbook.Worksheets.Count
            For i = 1 To n
                For Each pt In ActiveWorkbook.Worksheets(i).PivotTables
                    pt.HasAutoFormat = False
                Next pt
            Next i    
        End Sub
        
    3. Ejecutamos la subrutina, F5.
    4. Habremos deseactivado las casillas de Autoajustar anchos de columnas al actualizar en todas las tablas dinámicas de la hoja activa o del libro, dependiendo de la opción elegida.

    Referencias

    2016-12-12

    Desactivar autoajustar anchos de columnas al actualizar tablas dinámicas

    Title

    Problema

    Por defecto al crear una tabla dinámica Excel actualizará automáticamente el ancho las columnas de la tabla dinámica automáticamente al tamaño del texto o valor de número más extenso.

    Solución

    Para desactivar esta opción

    1. Abrimos el cuadro de diálogo Opciones de tabla dinámica, botón secundario del ratón y clic en Opciones de tabla dinámica.
    2. Desactivamos la casilla Autoajustar anchos de columnas al actualizar.

    Referencias

    2016-12-09

    Reemplazar saltos de línea por comas con Notepad++

    Title

    Problema

    Queremos reemplazar los saltos de línea con comas con Notepad++.

    Solución

    1. Hacemos clic en Ctrl+H, o mediante la barra de menú Search > Replace.
    2. Escribimos en Find what:[\r\n]+
    3. Y en Replace with, una coma seguida de un espacio: ,
    4. Marcamos la botón Regular expression y presionamos Replace All.

    Resultado final

    Entradas relacionadas

    2016-12-06

    Obtener abreviatura y nombre de meses a partir de un vector numérico en R

    Title

    Problema

    En R deseamos obtener los nombre de los mesos, o las 3 iniciales los mismos, en inglés a partir de un vector numérico.

    Solución

    Empleamos las constantes month.abb y month.name que contienen respectivamente la abreviatura de 3 letras y los nombres de los nombres de los meses en inglés.

    mes_num <- 1:12
    mes_abr <- month.abb[mes_num]
    mes_nombre <- month.name[mes_num]
    data.frame(mes_num, mes_letra, mes_nombre)
    

    Resultado

       mes_num mes_abr mes_nombre
    1        1       Jan    January
    2        2       Feb   February
    3        3       Mar      March
    4        4       Apr      April
    5        5       May        May
    6        6       Jun       June
    7        7       Jul       July
    8        8       Aug     August
    9        9       Sep  September
    10      10       Oct    October
    11      11       Nov   November
    12      12       Dec   December 
    

    Referencias

    2016-11-21

    Implementar la función hash SHA-256 en R

    Title

    Problema

    Deseamos calcular el valor encriptado hash SHA-256 para un vector. Al igual que hicimos en una entrada anterior con un rango de celdas en Excel.

    Solución

    Empleamos el paquete digest

    library(digest)
    v <- c("Felix", "Captain", "Normal", "Lloyd")
    sapply(v, digest, algo = "sha256", serialize = FALSE)
    

    Resultado

                                                                 Felix 
    "f6b6aad7a7690810466cb5288aea79c4eccd72d05bae7ab16be65bf9b3b6538e" 
                                                               Captain 
    "2e786c488b83f8be6227bd1b9f3fcab07f0a54e31c228694c842752303351448" 
                                                                Normal 
    "a7248eeb45eb1ce247f81693283e22e8b39e8a50890cecd22d02e75025547d90" 
                                                                 Lloyd 
    "99ce5e0b2a2d6b65936b323b6cb0dbcbb6f5518a9d3348612eaa965e43f185ce" 
    

    Notas

    Como se puede ver en el resultado, obtenemos un resultado idéntico al obtenido en la entrada de Excel. Para ello tenemos que especificar el argumento serialize = FALSE. Hemos empleado el algoritmo sha256, pero digest también nos permite usar los algoritmos: 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash' y 'murmurhash'.

    Referencias

    2016-11-16

    Eliminar líneas en blanco con Notepad++

    Title

    Problema

    Queremos eliminar las líneas en blanco con Notepad++.

    Solución

    • TextFX
      1. Instalamos el plugin TextFX Characters: Plugins, Plugin Manager y Show Plugin Manager.
      2. Seleccionamos el texto, y en el menú TextFX, TextFX Edit y clic en Delete Blank Lines.
      3. Si elegimos la opción Delete Surplus Blank Lines, dejará un único salto de línea allá donde hubiera múltiples.

    Resultado final

    Entradas relacionadas

    Nube de datos