60561


連続して重複しているデータのみ削除の仕方がわかりません。  
`distinct(X,Y,.keep_all = T)`で重複しているデータを削除する仕方はわかったのですが、連続関係なく同じ行が削除されてしまいます。  
連続して同じデータのみ先頭の行を残して削除するにはどうしたらいいでしょうか。何か方法ありませんか？


CC BY-SA 4.0
2019-11-15T06:33:39.207
60541
2019-11-15T12:35:30.727
34824
question
r
連続して重複しているデータの削除の仕方がわかりません


`lag`を使うことで一つ前の値を取ることができます。  
これを`filter`と組み合わせることで、一つ前の行のデータと異なる場合を抽出可能です。

[code]

    # デモデータ作成
    demo <- tibble(value=sample(LETTERS, 50, replace = TRUE))
    
    # lagを使ってfilter
    filtered <- demo %>% filter(value != lag(value, 1))
    
[/code]


CC BY-SA 4.0
2019-11-15T07:50:05.360
60549
2019-11-15T07:50:05.360
36395
60541
answer


[data.table](https://cran.r-project.org/web/packages/data.table/index.html)パッケージ(`rleid()`関数)を使う方法を挙げておきます。

[code]

    > library(data.table)
    > df <- data.frame(
        X = c(1, 1, 3, 5, 1, 2, 2, 2, 3, 5),
        Y = c(2, 2, 4, 6, 2, 3, 3, 3, 4, 6),
        Z = c(letters[1:10])
      )
    
       X Y Z
    1  1 2 a
    2  1 2 b
    3  3 4 c
    4  5 6 d
    5  1 2 e
    6  2 3 f
    7  2 3 g
    8  2 3 h
    9  3 4 i
    10 5 6 j
    
[/code]

カラム X, Y の値が同一の連続行を一行に約めます。

[code]

    > aggregate(
        df,
        by  = list(rleid(df$X, df$Y)),
        FUN = function(x) x[1]
      )[, c(names(df))]
    
      X Y Z
    1 1 2 a
    2 3 4 c
    3 5 6 d
    4 1 2 e
    5 2 3 f
    6 3 4 i
    7 5 6 j
    
[/code]

ちなみに、上記の場合は重複行の先頭を取り出しますが、末尾の場合は `x[length(x)]` を使います。

[code]

    > aggregate(
        df,
        by  = list(rleid(df$X, df$Y)),
        FUN = function(x) x[length(x)]
      )[, c(names(df))]
    
      X Y Z
    1 1 2 b
    2 3 4 c
    3 5 6 d
    4 1 2 e
    5 2 3 h
    6 3 4 i
    7 5 6 j
    
[/code]

なお、data.table だけで処理する場合は以下の様になります。

[code]

    > data.table(df)[
        , k := rleid(X, Y)
      ][
        , N := .N, keyby = k
      ][
        ## 末尾行の場合は `mult = "last"`
        J(unique(k)), mult = "first"
      ][
        , names(df), with = FALSE
      ]
    
[/code]


CC BY-SA 4.0
2019-11-15T12:35:30.727
60561
2019-11-15T12:35:30.727
60541
answer