データフレームから重複行を削除しようとしています。前の行のみに基づいています。 duplicate
とunique
の関数はすべての重複を削除し、あなたには一意の行しか残さず、これは私が望むものではありません。前の行のみに基づいて重複行を削除します。
私はこの問題をループで説明しました。実際のデータセットはループを使用するためにはるかに大きいので、これをベクトル化する必要があります。
x <- c(1,1,1,1,3,3,3,4)
y <- c(1,1,1,1,3,3,3,4)
z <- c(1,2,1,1,3,2,2,4)
xy <- data.frame(x,y,z)
xy
x y z
1 1 1 1
2 1 1 2
3 1 1 1
4 1 1 1 #this should be removed
5 3 3 3
6 3 3 2
7 3 3 2 #this should be removed
8 4 4 4
# loop that produces desired output
toRemove <- NULL
for (i in 2:nrow(xy)){
test <- as.vector(xy[i,] == xy[i-1,])
if (!(FALSE %in% test)){
toRemove <- c(toRemove, i) #build a vector of rows to remove
}
}
xy[-toRemove,] #exclude rows
x y z
1 1 1 1
2 1 1 2
3 1 1 1
5 3 3 3
6 3 3 2
8 4 4 4
私はdplyrのlag
機能を使用してみましたが、私はそれが動作しない、すべての3つの列の上にそれを実行しようとすると、それだけで、単一の列に取り組んでいます。
ifelse(xy[,1:3] == lag(xy[,1:3],1), NA, xy[,1:3])
これを実現する方法上の任意のアドバイスはありますか?私たちは、行は上記と同じである場合、削除するよう
zx8754のアプローチは確かに行く方法です。しかし、 'mutly_each'を使う限り、' dplyr :: lag'でこれを行うことができます。たとえば、 'xy%>% mutate_each(funs(oneL = .lag(。)))%>% mutate(dup = rowSums(select、。、containsL))))%>% select(x、y、z) ' –