這將分成不同的看法給你有什麼,但仍是一個相當不錯的表結構,我認爲:
chunk.2 <- function(x, n, force.number.of.groups = TRUE, len = length(x), groups = trunc(len/n), overflow = len%%n) {
if(force.number.of.groups) {
f1 <- as.character(sort(rep(1:n, groups)))
f <- as.character(c(f1, rep(n, overflow)))
} else {
f1 <- as.character(sort(rep(1:groups, n)))
f <- as.character(c(f1, rep("overflow", overflow)))
}
g <- split(x, f)
if(force.number.of.groups) {
g.names <- names(g)
g.names.ordered <- as.character(sort(as.numeric(g.names)))
} else {
g.names <- names(g[-length(g)])
g.names.ordered <- as.character(sort(as.numeric(g.names)))
g.names.ordered <- c(g.names.ordered, "overflow")
}
return(g[g.names.ordered])
}
哪將根據你想要的格式給你以下內容:
> x <- 1:10; n <- 3
> chunk.2(x, n, force.number.of.groups = FALSE)
$`1`
[1] 1 2 3
$`2`
[1] 4 5 6
$`3`
[1] 7 8 9
$overflow
[1] 10
> chunk.2(x, n, force.number.of.groups = TRUE)
$`1`
[1] 1 2 3
$`2`
[1] 4 5 6
$`3`
[1] 7 8 9 10
使用這些設置運行幾個定時:
set.seed(42)
x <- rnorm(1:1e7)
n <- 3
然後我們有以下結果:
> system.time(chunk(x, n)) # your function
user system elapsed
29.500 0.620 30.125
> system.time(chunk.2(x, n, force.number.of.groups = TRUE))
user system elapsed
5.360 0.300 5.663
編輯:從as.factor改變()來as.character()在我的功能使得它快兩倍。
是的,這是非常不清楚,你得到的是解決「大小相等的n個塊」。但是,也許這也讓你在那裏:x < - 1:10; n < - 3; split(x,cut(x,n,labels = FALSE)) – mdsumner 2010-07-23 14:08:03
問題中的解決方案和前面的註釋中的解決方案都不正確,因爲如果向量具有重複條目,則它們可能無法正常工作。試試這個: > foo <-c(rep(1,12),rep(2,3),rep(3,3)) [1] 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 3 3 >塊(FOO,2) (給出錯誤的結果) >塊(FOO,3) (也有錯) – mathheadinclouds 2013-04-29 09:21:35
(繼續前面的評論) 爲什麼呢? rank(x)不需要是整數 > rank(c(1,1,2,3)) [1] 1.5 1.5 3.0 4.0 所以這就是問題中的方法失敗的原因。 (x,n)分割(x,cut(seq_along(x),n,labels = FALSE)) – mathheadinclouds 2013-04-29 09:33:14