【发布时间】:2017-09-20 21:34:02
【问题描述】:
假设空字符串的基本as.integer() 强制是NA 没有警告,如:
str( as.integer(c('1234','5678','')) ) # int [1:3] 1234 5678 NA -- no warning
我很难理解为什么bit64::as.integer64() 在没有警告的情况下强制为零:
library('bit64')
str( as.integer64(c('1234','5678','')) ) # integer64 [1:3] 1234 5678 0 -- no warning
比较奇怪的是:
str( as.integer(c('1234','5678','', 'Help me Stack Overflow')) )
# int [1:4] 1234 5678 NA NA -- coercion warning
与:
str( as.integer64(c('1234','5678','', 'Help me Stack Overflow')) )
# integer64 [1:4] 1234 5678 0 NA -- no warning
我的解决方法非常失败:
asInt64 <- function(s){
require(bit64)
ifelse(grepl('^\\d+$',s), as.integer64(s), NA_integer64_)
}
str(asInt64(c('1234','5678','', 'Help me Stack Overflow')) )
# num [1:4] 6.10e-321 2.81e-320 0.00 0.00
# huh?
所以,我问:
为什么会这样?
最好的解决方法是什么?
【问题讨论】:
-
可能是因为
strtoll("", ...)是0。解决方法可能是之后将这些grepl("\\D|^$", c('1234','5678','', 'Help me Stack Overflow'))转换为NA? -
@lukeA 你基本上回答了这个问题,谢谢。这个reference 建议在
strtoll返回0 时测试转换错误,as.integer64与endpointer逻辑不太相符。我将尝试提出更改,尽管我的 C 很生锈。如果您想发表您的评论作为答案,我会接受。