2012-01-15 11 views
3

私は1000個の値を持つベクトルを持っていますが、このベクトルを200個の値と100個の値の重なりを持つ複数のベクトルに '分割/分割/グループ化'したいとします。サンプルが重なっている分割ベクトルR

例えば:

vec = seq(1,1000) 
splitWithOverlap(vec, 200, 100) 

は、以下のベクターを返す必要があります。

[0:200] [100:300] [200:400] [300:500] ... 

を...あなたのアイデアを得ます。

私はこれを行うことができるRの関数はありますか?

答えて

3

ありませんが、これはそれを行います。

splitWithOverlap <- function(vec, seg.length, overlap) { 
    starts = seq(1, length(vec), by=seg.length-overlap) 
    ends = starts + seg.length - 1 
    ends[ends > length(vec)] = length(vec) 

    lapply(1:length(starts), function(i) vec[starts[i]:ends[i]]) 
} 
> splitWithOverlap(1:100, 20, 10) 
[[1]] 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

[[2]] 
[1] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 

[[3]] 
[1] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 

[[4]] 
[1] 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 

[[5]] 
[1] 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 

[[6]] 
[1] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 

[[7]] 
[1] 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 

[[8]] 
[1] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 

[[9]] 
[1] 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 

[[10]] 
[1] 91 92 93 94 95 96 97 98 99 100 
7

rollapply行希望ベクトルで行列mを作成します。そのような結果が十分であれば、その時点でコードの最後の行を省略してください。ベクトルのリストは、行によって分割を希望される場合はそうでない場合は、:少しの作業で

library(zoo) 

x <- 1:1000 # test input 

m <- rollapply(x, 200, by = 100, c) 
split(m, row(m)) 
2

、あなたは一緒に以下の機能

?graphics::co.intervals

co.intervals(vec, 9, 0.5) 
# then use split, or shingle 

?lattice::shingle

shingle(vec, intervals=co.intervals(vec, 9, 0.5)) 
をラップすることができ
関連する問題