【问题标题】:Error when generating histogram in R在 R 中生成直方图时出错
【发布时间】:2017-10-16 09:38:57
【问题描述】:

我有一个文本文件,其中包含:

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

提示此错误的问题可能是什么?

【问题讨论】:

    标签: r


    【解决方案1】:

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

    hist.default 函数计算直方图的中点时会产生错误。这个向量mids &lt;- 0.5 * (breaks[-1L] + breaks[-nB]) 计算每次休息之间的中点。问题的出现是因为中断是作为整数生成的:

    如果参数breaksnumericlength == 1,则hist.default 函数(由hist.POSIXt 调用)基于x 的范围和数字创建breaks 的向量的休息。这是使用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

    【讨论】:

      【解决方案2】:

      在我的环境中,它不会产生任何错误。

      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 是由 read.csv() 创建的 dataset 唯一列的默认名称。

      【讨论】:

      • 和你一样,我没有收到上面数据的警告,但我可以用更少的中断来复制它。我猜这个问题与休息时间太少有关,而且问题中的数据集不是完整的。
      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多