RStudio中剪切功能分箱的不一致性

时间:2016-10-10 14:37:23

标签: r

以下是RStudio中带有RMarkdown文件的一些实验:

---
title: "test"
author: "qed"
date: "10/10/2016"
output: html_document
---


```{r}
library(ISLR)
set.seed(3)
Wage$age = jitter(Wage$age)
get_breaks = function(cutted) {
  labels = levels(cutted)
  lower = as.numeric(sub("\\((.+),.*", "\\1", labels))
  upper = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labels[length(labels)]))
  c(lower, upper)
}
age_groups = cut(Wage$age, 4)
age_groups1 = cut(Wage$age, get_breaks(age_groups))
all(levels(age_groups) == levels(age_groups1))
idx = which(age_groups != age_groups1)
idx # not empty!
```

如果你编织它,你会发现idx不是空的。

RStudio版本0.99.903

R版本3.3.1

Essentailly,我试图从cut函数的输出中提取中断并显式应用它。预计新输出应与旧输出完全相同,但它们不是。

这是一个错误吗?如何解决?

修改

实际上,在R控制台中反复尝试之后,同样的问题也存在,所以它不是RStudio错误。更令人不安的是,尽管set.seed,这种行为似乎并不具有确定性。

1 个答案:

答案 0 :(得分:1)

认为切割矢量的两种方法是等价的,但它们不是。此问题与RStudio或 knitr 无关。在正常的R会话中很容易显示问题:

problem = function() {
  library(ISLR)
  set.seed(NULL)  # reinitialize random seed
  Wage$age.jittered = jitter(Wage$age)
  get_breaks = function(cutted) {
    labels = levels(cutted)
    lower = as.numeric(sub("\\((.+),.*", "\\1", labels))
    upper = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labels[length(labels)]))
    c(lower, upper)
  }
  age_groups = cut(Wage$age.jittered, 4)
  age_groups1 = cut(Wage$age.jittered, get_breaks(age_groups))
  all(levels(age_groups) == levels(age_groups1))
  idx = which(age_groups != age_groups1)
  length(idx)
}

res = replicate(1000, problem())
barplot(table(res))

frequency of length(idx)

您希望条形图在0处只有非零频率,但idx的长度在很多时候都不为零。

回到你的问题,你看到的标签不一定是确切的终点。他们可以圆润。请参阅帮助页dig.lab中的参数?cut