2017-02-15 3 views
1

Aparently ifelse completelly番号を変更し、入力ERROR:ifelse( "NUM" 形態で)、dはinteger64戻りナンセンスである(D == 0、NA、D)、

のデータ・タイプを保存しませんたとえば:

library(bit64) 
d <- c(1:10,NA,12,0) %>% as.integer64() 
d %>% str 
Class 'integer64' num [1:13] 4.94e-324 9.88e-324 1.48e-323 1.98e-323 2.47e-323 ... 

ifelse(d==0,NA,d) %>% str 
num [1:13] 4.94e-324 9.88e-324 1.48e-323 1.98e-323 2.47e-323 ... 
ifelse(d==0,5,d) %>% str 
num [1:13] 4.94e-324 9.88e-324 1.48e-323 1.98e-323 2.47e-323 ... 
ifelse(d==5,50,d) %>% str 
num [1:13] 4.94e-324 9.88e-324 1.48e-323 1.98e-323 5.00e+01 ... 

上: - 出力内の数字はナンセンス ある - フォーマットの出力が「NUM」

あり、これは既知の問題ですか?

ifelseの代わりに使用する別の機能はありますか?

EDIT1:data.table操作

d <- data.table(a=c(1:10,NA,12,0) %>% as.integer64) 
d[a==0,a:=NA] 
d 
         a 
1:     1 
2:     2 
3:     3 
4:     4 
5:     5 
6:     6 
7:     7 
8:     8 
9:     9 
10:     10 
11:     NA 
12:     12 
13: 9218868437227407266 

#obve: still incorrect, NA was interpreted as a nonsense integer64 

#now this works: 
    d <- data.table(a=c(1:10,NA,12,0) %>% as.integer64) 
d[a==0,a:=as.integer64(NA)] 
d 
    a 
1: 1 
2: 2 
3: 3 
4: 4 
5: 5 
6: 6 
7: 7 
8: 8 
9: 9 
10: 10 
11: NA 
12: 12 
13: NA 

EDIT2でifelseを交換する:しようと試みifelse as.integer64の出力をpading()。動作しません!

d <- c(1:10,NA,12,0) %>% as.integer64() 
ifelse(d==0,as.integer64(NA),as.integer64(d)) 
[1] 4.940656e-324 9.881313e-324 1.482197e-323 1.976263e-323 2.470328e-323 2.964394e-323 3.458460e-323 3.952525e-323 
[9] 4.446591e-323 4.940656e-323   NA 5.928788e-323 0.000000e+00 

編集3:追加ソースパッケージ(bit64)

+0

このパッケージは、「integer64」(bit64?)に使用していますか? –

+1

'ifelse'の欠点のかなり良い要約が、新しい' ifelse2'バージョンの議論とともにここに要約されました:https://stat.ethz.ch/pipermail/r-devel/2016-August/072970.html –

+0

@RYoda:はい私はbit64パッケージを使用しています。 – LucasMation

答えて

3

データ型integer64bit64パッケージは内部Rで利用可能でのみ64ビット・データ・タイプを使用してから:double

これは、いくつかのことを意味パッケージの現在の実装における制限、e。 G:

  • str:基本Rから継承されたが、正しく
  • NANA_integer64_

に交換しなければならない値は印刷されません。詳細については、ドキュメントを読んでください:https://cran.r-project.org/web/packages/bit64/bit64.pdf

ifelseを使用してサンプルを作成する必要があります

  1. は再びifelseの結果にinteger64クラスを割り当てると、代わりにこのようなNA

NA_integer64_

  • 使用(それが原因にifelseknown deficiencies失われるため):

    library(bit64) 
    library(dplyr) 
    d <- c(1:10,NA_integer64_,12,0) %>% as.integer64() 
    d 
    # integer64 
    # [1] 1 2 3 4 5 6 7 8 9 10 0 12 0 
    class(d) 
    # [1] "integer64" 
    e <- ifelse(d==0,NA_integer64_,d) 
    e 
    # [1] 4.940656e-324 9.881313e-324 1.482197e-323 1.976263e-323 2.470328e-323 2.964394e-323 3.458460e-323 3.952525e-323 4.446591e-323 
    # [10] 4.940656e-323 0.000000e+00 5.928788e-323 0.000000e+00 
    class(e) 
    # [1] "numeric" 
    class(e) <- "integer64" 
    e 
    # integer64 
    # [1] 1 2 3 4 5 6 7 8 9 10 <NA> 12 <NA> 
    

    をあなたの場合今すぐstrではなくbit64でサポートしています)を呼び出すと、再びゴミが表示されます。

    > str(e)  # same as: e %>% str 
    Class 'integer64' num [1:13] 4.94e-324 9.88e-324 1.48e-323 1.98e-323 2.47e-323 ... 
    
  • 関連する問題