我有一个包含以下内容的文本文件:
Tue Feb 11 12:19:39 +0000 2014
Tue Feb 11 12:19:56 +0000 2014
Tue Feb 11 12:20:04 +0000 2014
我将其读入r
dataset <- read.csv("Time.txt")
并且为了让R识别文件中的时间戳,我写道:
time <- strptime(dataset[,1], format = "%a %b %d %H:%M:%S %z %Y")
每当我尝试用直方图绘制:
hist(time, breaks = 100)
它与生成的直方图一起产生错误
In breaks[-1L] + breaks[-nB] : NAs produced by integer overflow
引发此错误的问题是什么?
答案 0 :(得分:4)
由于您在这里询问可能导致错误的原因是:
当hist.default
函数计算直方图的中点时,会创建错误。此向量mids <- 0.5 * (breaks[-1L] + breaks[-nB])
计算每次中断之间的中间点。出现问题是因为中断是以整数生成的:
如果参数breaks
为numeric
且length == 1
,那么hist.default
函数(由hist.POSIXt
调用)会创建breaks
的向量}基于x
的范围和休息次数。这是使用pretty
命令完成的。由于原因我没有仔细研究,如果breaks
足够小,pretty(range(x),n=breaks, min.n = 1)
只返回每个值中的一个,例如:
pretty(range(x), n = 35, min.n = 1)
#[1] 1392121179 1392121180 1392121181 1392121182 1392121183 1392121184
#[7] 1392121185 1392121186 1392121187 1392121188 1392121189 1392121190
#[13] 1392121191 1392121192 1392121193 1392121194 1392121195 1392121196
#[19] 1392121197 1392121198 1392121199 1392121200 1392121201 1392121202
#[25] 1392121203 1392121204
然后输出为integer
类型。但是,如果中断的数量较大且某些输出重复:
pretty(range(x), n = 36, min.n = 1)
# [1] 1392121179 1392121180 1392121180 1392121181 1392121181 1392121182
# [7] 1392121182 1392121183 1392121183 1392121184 1392121184 1392121185
#[13] 1392121185 1392121186 1392121186 1392121187 1392121187 1392121188
#[19] 1392121188 1392121189 1392121189 1392121190 1392121190 1392121191
#[25] 1392121191 1392121192 1392121192 1392121193 1392121193 1392121194
#[31] 1392121194 1392121195 1392121195 1392121196 1392121196 1392121197
#[37] 1392121197 1392121198 1392121198 1392121199 1392121199 1392121200
#[43] 1392121200 1392121201 1392121201 1392121202 1392121202 1392121203
#[49] 1392121203 1392121204 1392121204
然后输出为numeric
。
因为R使用32位整数类型且POSIXt
整数是大数,所以添加两个POSIXt
整数会导致R无法处理并返回NA
的溢出。当pretty
返回数字时,这不是问题。
另请参阅:What is integer overflow in R and how can it happen?
在实践中,所有这些意味着,如果您打印出返回的hist
结构,您的所有mids
值都将为NA
,但我认为它实际上不会影响绘制直方图。因此,这只是一个警告。
编辑:
pretty
内部使用seq.int
答案 1 :(得分:0)
在我的环境中,它不会产生任何错误。
dataset <- read.csv("Time.txt", header = F)
time <- strptime(dataset[,1], format = "%a %b %d %H:%M:%S %z %Y")
hist(as.numeric(time), breaks = 100)
也许如果您只是将时间转换为数字,则错误将消失。然后,可以直接更改直方图的x轴。
编辑:ggplot2
不应该面对这个问题,而且更加简单和现代:
ggplot(dataset) + geom_histogram(aes(x = V1), stat = "count", bins = 100)
其中V1是由dataset
创建的read.csv()
唯一列的默认名称。