2016-04-23 7 views
1

はこのようなものだが、私は、データテーブル(またはフレーム)を持っているとしましょう次の行検索:Rは、値が変更

Time Value 
1   10 
2   10 
3   10 
4   15 
5   15 
6   20 

私は価値の次の変化の時間と値をマーク列を添付したいのですが。

Time Value T_Next V_Next 
1   10   4    15 
2   10   4    15 
3   10   4    15 
4   15   6    20 
5   15   6    20 
6   20   NA   NA 

最後の行はあまり気にしません。私がこれを行うと考えることができる唯一の方法は、いくつかのネストされたforループであり、これは遅く、大きなデータセットを持っています。私はそれを行うために、より多くのRスタイルの方法があると確信しています。どんな助けにも感謝!何これについて

答えて

3

はここ

cbind(df, df[rep(cumsum(rle(df$Value)$lengths) + 1, rle(df$Value)$lengths),]) 
    Time Value Time Value 
4  1 10 4 15 
4.1 2 10 4 15 
4.2 3 10 4 15 
6  4 15 6 20 
6.1 5 15 6 20 
NA  6 20 NA NA 
+0

いいですね。 –

+0

@DavidArenburgありがとう:-) – DatamineR

0

を?: data.tableを持つ別のオプションです。 'data.frame'を 'data.table'に変換し、を 'Value'のrleidにグループ化すると、 'Time'と 'Value'のmaxが2つの列 'T_next'と 'V_next'を作成します。次に、最後の行をNAに変更します。

library(data.table) 
setDT(df1)[, paste(c("T", "V"), "next", sep="_") := lapply(.SD, max), 
    by = .(shift(rleid(Value), fill = 1))][.N, c("T_next", "V_next") := rep(list(NA),2)][] 
# Time Value T_next V_next 
#1: 1 10  4  4 
#2: 2 10  4  4 
#3: 3 10  4  4 
#4: 4 15  4  4 
#5: 5 15  6  6 
#6: 6 20  NA  NA