El ile olmayan bir yol, ondalık değeri paste()
ile eklemek ve ardından sayısal olarak geri yüklemek olabilir.
x <- c(2, 14, 128, 1940, 140, 20000)
as.numeric(paste0(".", x))
# [1] 0.200 0.140 0.128 0.194 0.140 0.200
Güncelleme 1: İki orijinal olarak yayınlanan yöntemlerin zamanlamaları hakkında bazı ilgi vardı. Aşağıdaki kriterlere göre, yaklaşık aynı görünüyorlar.
library(microbenchmark)
x <- 1:1e5
microbenchmark(
david = { david <- x/10^nchar(x) },
richard = { richard <- as.numeric(paste0(".", x)) }
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# david 88.94391 89.18379 89.70962 89.40736 89.71012 99.68126 100
# richard 87.89776 88.17234 89.38383 88.44439 88.77052 105.06066 100
identical(richard, david)
# [1] TRUE
Güncelleme 2: Ben de sprintf()
genellikle daha hızlı paste0()
daha hatırlardım. Aşağıdakileri de kullanabiliriz. aşağıda gösterildiği gibi Şimdi yukarıdan aynı x
kullanarak ve sadece bu iki seçenek karşılaştıran
as.numeric(sprintf(".%d", x))
biz paste()
karşı sprintf()
zamanlaması iyi bir gelişme var.
microbenchmark(
paste0 = as.numeric(paste0(".", x)),
sprintf = as.numeric(sprintf(".%d", x))
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# paste0 87.89413 88.41606 90.25795 88.82484 89.65674 107.8080 100
# sprintf 61.16524 61.23328 62.26202 61.29192 61.48316 79.1202 100
Herhangi bir matematik olmadan "as.numeric" yapınız (paste0 (".", X)) ' –
12 ve 1200'ün eşit olduğu anlamına mı geliyor? – DatamineR
@DatamineR evet. – SlightlyBuilt