SORU
5 AĞUSTOS 2010, PERŞEMBE


Nasıl bir bilgi kaybı olmadan tam sayı\bir sayısal bir faktör dönüştürmek için?

Sayısal veya bir tamsayı için bir faktör dönüştürdüğünüzde, temel seviyede kodları, numaraları gibi değerleri alıyorum.

f <- factor(sample(runif(5), 20, replace = TRUE))
##  [1] 0.0248644019011408 0.0248644019011408 0.179684827337041 
##  [4] 0.0284090070053935 0.363644931698218  0.363644931698218 
##  [7] 0.179684827337041  0.249704354675487  0.249704354675487 
## [10] 0.0248644019011408 0.249704354675487  0.0284090070053935
## [13] 0.179684827337041  0.0248644019011408 0.179684827337041 
## [16] 0.363644931698218  0.249704354675487  0.363644931698218 
## [19] 0.179684827337041  0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218

as.numeric(f)
##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

as.integer(f)
##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

paste başvurmak için gerçek değerleri almam lazım.

as.numeric(paste(f))
##  [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
##  [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901

Daha iyi bir şekilde sayısal bir faktör dönüştürmek için var mı?

CEVAP
5 AĞUSTOS 2010, PERŞEMBE


?factor Uyarı bölümüne bakın:

Özellikle, as.numeric uygulanan için anlamsız bir faktör olabilir. örtülü zorlamayla olur. İçin dönüşüm 8 ** bir faktör orijinal sayısal yaklaşık değerler, as.numeric(levels(f))[f] tavsiye ve biraz daha daha verimli as.numeric(as.character(f)).

R has similar advice SSS.


Neden as.numeric(levels(f))[f] as.numeric(as.character(f)) daha verimli olur?

as.numeric(as.character(f)) etkili nlevels(x) değerler length(x) değerleri yerine sayısal dönüştürme yapıyorsanız yani 14**. Hız farkı birkaç seviyeleri ile uzun vektörleri için en belli olacak. Eğer bu değerler çoğunlukla benzersiz, hız olarak pek bir fark olmayacak. dönüşüm yaparsanız yapın, bu işlem kodunuzu darboğaz olmak unliekly, bu yüzden çok fazla dert etmeyin.


Bazı zamanlamalar

library(microbenchmark)
microbenchmark(
  as.numeric(levels(f))[f],
  as.numeric(levels(f)[f]),
  as.numeric(as.character(f)),
  paste0(x),
  paste(x),
  times = 1e5
)
## Unit: microseconds
##                         expr   min    lq      mean median     uq      max neval
##     as.numeric(levels(f))[f] 3.982 5.120  6.088624  5.405  5.974 1981.418 1e 05
##     as.numeric(levels(f)[f]) 5.973 7.111  8.352032  7.396  8.250 4256.380 1e 05
##  as.numeric(as.character(f)) 6.827 8.249  9.628264  8.534  9.671 1983.694 1e 05
##                    paste0(x) 7.964 9.387 11.026351  9.956 10.810 2911.257 1e 05
##                     paste(x) 7.965 9.387 11.127308  9.956 11.093 2419.458 1e 05

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • BrandonHarrisWalker

    BrandonHarri

    27 Kasım 2006
  • DrePwn

    DrePwn

    22 Temmuz 2011