我读了这篇文章http://www.r-bloggers.com/comparing-hist-and-cut-r-functions/,测试hist()速度比cut()我的PC 快了~4倍.我的脚本循环遍历cut()很多次,因此省时很重要.因此我试图切换到更快的功能,但是很难获得准确的输出cut().
从以下示例代码:
data <- rnorm(10, mean=0, sd=1) #generate data
my_breaks <- seq(-6, 6, by=1) #create a vector that specifies my break points
cut(data, breaks=my_breaks)
Run Code Online (Sandbox Code Playgroud)
我希望得到一个包含级别的向量,使用我的断点将每个数据元素分配给它,即:的确切输出cut:
[1] (1,2] (-1,0] (0,1] (1,2] (0,1] (-1,0] (-1,0] (0,1] (-2,-1] (0,1]
Levels: (-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] (3,4] (4,5] (5,6]
>
Run Code Online (Sandbox Code Playgroud)
我的问题:我如何使用hist()输出元素(即中断,计数,密度,中等)或findInterval达到我的目标?
另外,我发现从一个例子/sf/ask/866538991/使用findInterval,但是这需要我事先创建的间隔的标签,这是不是我想要的.
任何帮助,将不胜感激.提前致谢!
这是一个基于你的findInterval建议的实现,比经典的快5-6倍cut:
cut2 <- function(x, breaks) {
labels <- paste0("(", breaks[-length(breaks)], ",", breaks[-1L], "]")
return(factor(labels[findInterval(x, breaks)], levels=labels))
}
library(microbenchmark)
set.seed(1)
data <- rnorm(1e4, mean=0, sd=1)
microbenchmark(cut.default(data, my_breaks), cut2(data, my_breaks))
# Unit: microseconds
# expr min lq median uq max neval
# cut.default(data, my_breaks) 3011.932 3031.1705 3046.5245 3075.3085 4119.147 100
# cut2(data, my_breaks) 453.761 459.8045 464.0755 469.4605 1462.020 100
identical(cut(data, my_breaks), cut2(data, my_breaks))
# TRUE
Run Code Online (Sandbox Code Playgroud)