2016-06-30 28 views
1

私はこのデータフレームdf1を持っています。私は次のように、インデックス列を更新したい前の行の値に基づいて列を更新する

User|Date|Index| 
    a |1 |1 | 
    a |1 |2 | 
    a |1 |3 | 
    a |1 |0 | 
    a |1 |5 | 
    a |1 |6 | 
    a |2 |0 | 
    b |4 |1 | 
    b |4 |2 | 
    b |4 |3 | 

  1. グループのデータユーザー、日によって;
  2. 行が正しく順序付けられていると仮定します。
  3. 0の値を見つけたときに、列の索引を参照して1に更新し、次の行を修正して、前の行に基づいて1を増分して別の0が見つかるまで修正します。

これまでに絞り込んだことがありますが、私が望むことをやり遂げるためにどのように補完部品が完成するかはわかりません。

df1 %>% 
    group_by(User, Date) %>% 
    mutate(Index = replace(Index,) 

誰でも助けてもらえますか?


編集: 上記のデータフレームは簡略化されています。これがコードです。

df1 <-structure(list(User = c(2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,3), 
    Date = c(16864, 16864, 16864, 16864, 16864, 16879, 16879,16879, 16879, 16879, 16879, 16879, 16879, 16879), 
    Index = c(16,17, 0, 19, 20, 1, 2, 3, 0, 5, 0, 0, 8, 9)), 
    class = "data.frame", .Names = c("User","Date", "Index"), row.names = c(NA, -14L)) 

これは、現在の外観です:

User|Date |Index| 
    2 |16864 |16 | 
    2 |16864 |17 | 
    2 |16864 |0 | 
    2 |16864 |19 | 
    2 |16864 |20 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |3 | 
    3 |16879 |0 | 
    3 |16879 |5 | 
    3 |16879 |0 | 
    3 |16879 |0 | 
    3 |16879 |8 | 
    3 |16879 |9 | 

所望の出力は次のようになります。

User|Date |Index| 
    2 |16864 |16 | 
    2 |16864 |17 | 
    2 |16864 |1 | 
    2 |16864 |2 | 
    2 |16864 |3 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |3 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |1 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |3 | 
+0

予想外を表示できますか置く?また、[このリンクを見てください](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)と改訂 – Sotos

+0

単純に置き換えない理由はありますか最初のステップとして1秒のゼロ?それらのすべてを置き換えている場合、なぜこれを繰り返し実行する必要があるのか​​わかりません。 – mkt

+0

0の特別な理由はありません。私はすでに1として開始することができると思います。 – JessicaJones

答えて

3

あり、これを達成するために、よりスマートな方法は、おそらくですが、ここではカスタム関数と私の試みです

myfun <- function(x) { 
    indx <- which(x == 0L) 
    c(x[1L:(indx[1L] - 1L)], sequence(c(diff(indx), length(x) - last(indx) + 1L))) 
} 

df1 %>% 
    group_by(User, Date) %>% 
    mutate(Index = myfun(Index)) 

# Source: local data frame [14 x 3] 
# Groups: User, Date [2] 
#  User Date Index 
# (dbl) (dbl) (dbl) 
# 1  2 16864 16 
# 2  2 16864 17 
# 3  2 16864  1 
# 4  2 16864  2 
# 5  2 16864  3 
# 6  3 16879  1 
# 7  3 16879  2 
# 8  3 16879  3 
# 9  3 16879  1 
# 10  3 16879  2 
# 11  3 16879  1 
# 12  3 16879  1 
# 13  3 16879  2 
# 14  3 16879  3 
+0

この機能を同様のデータフレームに適用すると、互換性のないサイズのエラーが返されます。なぜこれが起こっているのでしょうか?私は、デバッグを使用しようとしましたが、私は理由を把握することができませんでした。提案はありますか? – JessicaJones

関連する問題