2016-10-05 7 views
1

時間としきい値に基づいて時系列データのフレームをどのようにサブセット化しますか?r - 時間としきい値に基づいた時系列データのサブセットの設定

私は、このデータを持っている:

次のようになります
year <- seq(2000, 2009, 1) 
v1 <- sample(1:10, 10, replace=T) 
df <- data.frame(year, v1) 

v1の合計スコアはの値を超えたため
> df 
    year v1 
1 2000 9 
2 2001 4 
3 2002 5 
4 2003 4 
5 2004 5 
6 2005 3 
7 2006 3 
8 2007 3 
9 2008 9 
10 2009 6 

私はシーケンシャル年のグループによってデータをサブセットしたいです10.

この例のデータでは、最初のサブセットは2000年の観測値である& 2001を保持する必要があります。2番目のサブセットであるshou 2002年、2003年および2004年の観測を保持する。

実際のデータには、120年間にわたる約800万件の観測データがある。

+1

ご入力のための 'sample' –

答えて

2

あなたは、Reduce機能を使用して、カスタマイズcumsumを実装合計が10を超えたときに合計をリセットすると同時に、グループ変数としてカウントを増やすことができます。

library(data.table) 
transpose(Reduce(function(x, y) if(x[1] > 10) c(y, x[2]+1) else c(x[1] + y, x[2]), 
       init = c(0, 1), df$v1, accumulate = T))[[2]][-1] 

# here the init parameter will take two parameters, the first one keep track of the cumsum, 
# and the second one serves as a group variable, when the sum exceeds 10, reset the sum to 
# zero and increase the group variable by one 

# [1] 1 1 2 2 2 3 3 3 3 4 

それが終わっ千万を実行するために約20秒かかります観測ベクトル:

v = sample(1:10, 10000000, replace = T) 
system.time(transpose(Reduce(function(x, y) if(x[1] > 10) c(y, x[2]+1) else c(x[1] + y, x[2]), init = c(0, 1), v, accumulate = T))[[2]]) 

# user system elapsed 
# 19.509 0.552 20.081 
+0

感謝を用いた例を作成するときに' set.seed'を使用してください。これは素晴らしい作品で、私が探している答えのようなものです。このコードを使用すると、出力には 'df'より1つ多くの観測値があります。これはどこから来たと思いますか? –

+1

ああ、いいキャッチ。 'Reduce'関数に渡される初期パラメータから来ます。あなたは 'transpose(関数(x、y)if(x [1]> 10)c(y、x [2] +1)else c(x [1] + y、x [2] )、init = c(0,1)、df $ v1、accumulate = T))[[2]] [ - 1] 'である。 – Psidom

関連する問題