Efficient way to remove names of vector elements

Sometimes you must remove names of elements within a vector. The most classic way to do is to use unname() function. However, the use of as.numeric() or as.character() is more efficient if you know the content of the vector. In conclusion, to remove names, it is 5 times more rapid to use as.integer(), as.character(), as.numeric() or as.logical().

i <- c(Pi=pi)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur     système      écoulé 
      0.171       0.002       0.174 
system.time(for (j in 1:100000) k <- as.numeric(i))
utilisateur     système      écoulé 
      0.030       0.000       0.029 
 
i <- c(Pi=3)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur     système      écoulé 
      0.169       0.003       0.174 
system.time(for (j in 1:100000) k <- as.integer(i))
utilisateur     système      écoulé 
      0.028       0.000       0.028 
 
i <- c(Pi="pi")
system.time(for (j in 1:100000) k <- unname(i))
utilisateur     système      écoulé 
      0.183       0.002       0.185 
system.time(for (j in 1:100000) k <- as.character(i))
utilisateur     système      écoulé 
       0.03        0.00        0.03 
 
i <- c(B=TRUE)
system.time(for (j in 1:100000) k <- unname(i))
utilisateur     système      écoulé 
      0.157       0.002       0.159 
system.time(for (j in 1:100000) k <- as.logical(i))
utilisateur     système      écoulé 
      0.035       0.001       0.034 

The situation is worst in R 4.2:

> system.time(for (j in 1:100000) {i <- c(Pi=pi); attributes(i)$names <- NULL})
utilisateur     système      écoulé 
      0.069       0.001       0.070 
> system.time(for (j in 1:100000) {i <- c(Pi=pi); i <- as.numeric(i)})
utilisateur     système      écoulé 
      0.044       0.001       0.044 
> system.time(for (j in 1:100000) {i <- c(Pi=pi); i <- unname(i)})
utilisateur     système      écoulé 
      0.275       0.003       0.279 
> 0.279/0.044
[1] 6.34

unname() is 6 times slower than as.numeric()

If a vector is used, this is no more true:

> i <- rep(pi, 2000); names(i) <- paste0("P", 1:2000)
> system.time(for (j in 1:100000) {k <- i; attributes(k)$names <- NULL})
utilisateur     système      écoulé 
      0.574       0.090       0.663 
> system.time(for (j in 1:100000) {k <- i; k <- unname(k)})
utilisateur     système      écoulé 
      0.224       0.000       0.225 
> system.time(for (j in 1:100000) {k <- i; k <- as.numeric(k)})
utilisateur     système      écoulé 
      0.943       0.222       1.168 
> system.time(for (j in 1:100000) {k <- i; k <- as.vector(k)})
utilisateur     système      écoulé 
      1.071       0.202       1.274 


Commentaires

Posts les plus consultés de ce blog

Standard error from Hessian Matrix... what can be done when problem occurs

stepAIC from package MASS with AICc

Install treemix in ubuntu 20.04