【问题标题】:Cut and labels/breaks length conflict剪切和标签/中断长度冲突
【发布时间】:2012-10-15 05:34:32
【问题描述】:

我正在使用 cut 函数为条形图直方图准备数据,但在我的标签和中断之间不断遇到看似不一致的情况:

Error in cut.default(sample(1:1e+05, 500, T), breaks = sq, labels = sprintf("$%.0f", : labels/breaks length conflict

这是一个例子。我假装它是收入数据,在 10,000 美元的箱子中使用 0 到 100,000 美元的序列。我使用相同的变量来生成中断和标签,在标签端进行次要格式。我认为与字符向量相比,它们可能由于某种原因具有不同的长度,但它们似乎仍然具有相同的长度。

> sq<-seq(0,100000,10000)
> cut(sample(1:100000, 500, T),breaks=sq,labels=sprintf("$%.0f",sq))
> length(sprintf("$%.0f",sq))
[1] [11]
> length(sq)
[1] [11]

编辑:

根据@thelatemail 和@Josh O'Brien 的建议,我将代码更改为此代码,一切正常。 cut(sample(1:100000, 500, T),breaks=sq,labels=sprintf("$%.0f",sq[-1]))

【问题讨论】:

  • length(table(cut(sample(1:100000, 500, T),breaks=sq)))10,因此您不匹配。
  • 如果最终结果是直方图,为什么不简单地将breaks 参数用于hist() 函数?
  • 这就是我最终要做的。但是我很好奇为什么我不能完全解决cut的问题。

标签: r cut


【解决方案1】:

使用cut(),11 个分隔符分隔 10 个级别,这将只需要 10 个标签。 "labels/breaks length conflict" 错误告诉您对 sprintf() 的调用为 labels= 参数提供了太多标签。

在代码中:

breaks <- 0:10/10
dat <- runif(1e4)

length(breaks)
# [1] 11
length(levels(cut(breaks, sq)))
# [1] 10

【讨论】:

  • 漂亮而清晰。令人惊讶的是,not-so-clear doc for cut() 并没有说任何地方“如果breaks 是一个向量,那么labels 必须是一个长度小于breaks 的向量”。我感觉有一个 docbug 出现了。
猜你喜欢
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多