2015-05-01 31 views
2

創建的分割化矢量的列表有了這樣例子的代碼:ř由索引

set.seed(11) 
x <- sample(letters) 
x 
[1] "h" "a" "m" "y" "b" "u" "v" "f" "p" "c" "q" "g" "x" "l" "i" "o" "e" "r" "t" "d" "z" "k" "s" "j" "w" "n" 

並設置有值的這種載體

y <- c(4, 13, 20) 

我想通過分裂x矢量向上y矢量作爲「切片」索引。並將結果分組爲列表。期望的輸出:

z <- list(c("h", "a", "m", "y"),c("b", "u", "v", "f", "p", "c", "q", "g", "x"), c("l", "i", "o", "e", "r", "t", "d"), c("z", "k", "s", "j", "w", "n")) 
z 
[[1]] 
[1] "h" "a" "m" "y" 

[[2]] 
[1] "b" "u" "v" "f" "p" "c" "q" "g" "x" 

[[3]] 
[1] "l" "i" "o" "e" "r" "t" "d" 

[[4]] 
[1] "z" "k" "s" "j" "w" "n" 

回答

3

我們可以創建的「0」等於「x」的長度的矢量,使用y作爲數字索引與1替換元件在v1cumsum結果,並使用該作爲分組矢量分裂「X」

v1 <- numeric(length(x)) 
v1[y+1] <- 1 
split(x,cumsum(v1)) 

或者,我們可以這樣做的結果cumsum從得到的分組矢量tabulate

split(x,cumsum(tabulate(y+1, length(x)))) 

或者使用match

split(x,cumsum(c(TRUE,!is.na(match(seq_along(x), y)[-length(x)])))) 

或者%in%

split(x,cumsum(seq_along(x) %in% (y+1))) 
+0

@AlexA。謝謝你會添加一些 – akrun

3

爲了好玩,另闢蹊徑,開創分裂載體可以是使用cut

split(x, cut(seq_along(x), c(-Inf, y, Inf))) 
# $`(-Inf,4]` 
# [1] "h" "a" "m" "y" 
# 
# $`(4,13]` 
# [1] "b" "u" "v" "f" "p" "c" "q" "g" "x" 
# 
# $`(13,20]` 
# [1] "l" "i" "o" "e" "r" "t" "d" 
# 
# $`(20, Inf]` 
# [1] "z" "k" "s" "j" "w" "n" 

它甚至可以告訴你哪個組數據屬於:-)


通過擴展,這也意味着findInterval將工作:

split(x, findInterval(seq_along(x), y+1)) 

在這兩種情況下,我們在尋找從1倉中的值到所述輸入矢量「x」的長度落入,端點由「y」定義的地方。