Mostrando entradas con la etiqueta sapply. Mostrar todas las entradas
Mostrando entradas con la etiqueta sapply. Mostrar todas las entradas

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

2015-08-24

Seleccionar sólo las columnas que contengan NA en R

Title

Problema

De un data frame deseamos seleccionar aquellas columnas que contengan algún valor NA.

i3 <- c(1, 1, 1, 1, 2, 2)
i2 <- c(NA, 1, 1, 1, 2, 2)
i1 <- c(1, NA, 2, 4, 5, 3)
newdat1 <- data.frame(i3, i2, i1)
newdat1
  i3 i2 i1
1  1 NA  1
2  1  1 NA
3  1  1  2
4  1  1  4
5  2  2  5
6  2  2  3

Soluciones

De mayor a menor eficiencia.

  • sapply
  • newdat1[, sapply(newdat1, anyNA), drop = FALSE]
    
      i2 i1
    1 NA  1
    2  1 NA
    3  1  2
    4  1  4
    5  2  5
    6  2  3
    
  • colSums
  • newdat1[,is.na(colSums(newdat1))]
    
  • complete.cases
  • Mi alternativa propuesta. Transponemos el data frame y con complete.cases obtenemos un índice lógico (TRUE, FALSE, FALSE) con las columnas tienen algún NA. Como son aquellas que deseamos con incluir, con el operador ! invertimos el vector lógico anterior (FALSE, TRUE, TRUE) quedándonos con la segunda y tercera columnas.

    newdat1[!complete.cases(t(newdat1))]
    
  • apply
  • apply(newdat1, 2, function(x) sum(is.na(x)) == 0 )
    

    Referencias

    Nube de datos