2017-03-07 13 views
2

I削除行

x <- data.frame(id = c(1:6), 
       a = c('a', 'b', 'b', 'a', 'a', 'c'), 
       b = rep(2, 6), 
       c = c(5, 4, 4, 5, 5, 2)) 

> x 
    id a b c 
1 1 a 2 5 
2 2 b 2 4 
3 3 b 2 4 
4 4 a 2 5 
5 5 a 2 5 
6 6 c 2 2 

は私が

id a b c 
1 1 a 2 5 
2 2 b 2 4 
4 4 a 2 5 
6 6 c 2 2 

要件で終わるしたい、次のデータフレームは、私は削除することである持っています列がidを除き、前の行と同じ場合はその行。それが列の上の列と同じであるが直前ではない場合、それを取り除きたいとは思わない。たとえば、id4はid1と同じですが、すぐ上にはないので削除されません。

すべてのヘルプはここ

答えて

2

私たちは、私はちょうど、a、b及びcよりも多くの列を持っているしかし、私の実際の場合には、base R

x[!c(FALSE, !rowSums(x[-1, -1] != x[-nrow(x), -1])),] 
# id a b c 
#1 1 a 2 5 
#2 2 b 2 4 
#4 4 a 2 5 
#6 6 c 2 2 
+0

これはうまくいくでしょうが、私はそれを一般的な関数で持っています.Idカラムが最初のカラムになることを保証できませんので、このmethidを使うのは危険です – user1165199

+1

@ user1165199 'nm1 < - setdiff (x)、 "id"); x [-1、nm1]!= x [-nrow(x)、nm1])))、 – akrun

2

dplyrlag機能を使用しての方法ですいただければ幸いです。アイデアは、キー列を作成し、それが以前のものと同じかどうかをチェックすることです。

library(dplyr) 
x %>% 
    mutate(key=paste(a, b, c, sep="|")) %>% 
    filter(key != lag(key, default="0")) %>% 
    select(-key) 
+0

おかげでジェイソンを使用することができます。それらにすべて名前を付けることなくそれを行う方法はありますか? – user1165199

+1

この場合、非標準評価が必要だと思います。しかし、私は 'mutate_'を使ってキーを作成する方法を思いつきませんでした。私が終わるのは、 'x $ key < - apply(x [names(x [-1])]、1、function(x)paste(x、collapse =" | "))'です。 – JasonWang