2017-02-15 66 views
1

Aparently ifelse completelly改变的数量和不保留输入的数据类型ERROR:ifelse(d == 0,NA,d),其中d是integer64返回无义( “数” 的形式)

例如:

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 ... 

上图: - 数字输出是无稽之谈 - 格式的输出是“民”

这是一个已知的问题吗?

是否有另一个功能用来代替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:tryed pading ifelse as.integer64的输出()。不起作用!

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

bit64包中的数据类型integer64在内部使用可用R中的唯一的64位的数据类型:double

这意味着一些目前实施该方案的限制,例如,摹:

  • str:从基础R继承,不打印值正确
  • NA必须NA_integer64_

被替换请阅读更多细节的文档:https://cran.r-project.org/web/packages/bit64/bit64.pdf

要让您的示例使用ifelse您必须

  1. integer64类分配给的ifelse结果再次(因为它失去了应有的known deficienciesifelse)和
  2. 使用NA_integer64_代替NA

这样的:

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 ... 
相关问题