在R

时间:2017-10-16 09:38:57

标签: r

我有一个包含以下内容的文本文件:

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

引发此错误的问题是什么?

2 个答案:

答案 0 :(得分:4)

由于您在这里询问可能导致错误的原因是:

hist.default函数计算直方图的中点时,会创建错误。此向量mids <- 0.5 * (breaks[-1L] + breaks[-nB])计算每次中断之间的中间点。出现问题是因为中断是以整数生成的:

如果参数breaksnumericlength == 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()唯一列的默认名称。