13

(ベースで)連続している重複を削除したいデータフレームがあります。私はrleここで役立つかもしれないことを知っていますが、それを使用する方法を考えることはできません。出力例は、私が求めているものを明らかにするのに役立ちます。

サンプルデータを生成します。

set.seed(12)
samps <- sample(1:5, 20, T)
dat <- data.frame(v1=LETTERS[samps], v2=month.abb[samps])
dat[10, 2] <- "Mar"

サンプルデータ:

   v1  v2
1   A Jan
2   E May
3   E May
4   B Feb
5   A Jan
6   A Jan
7   A Jan
8   D Apr
9   A Jan
10  A Mar
11  B Feb
12  E May
13  B Feb
14  B Feb
15  B Feb
16  C Mar
17  C Mar
18  C Mar
19  D Apr
20  A Jan

望ましい結果:

   v1  v2
1   A Jan
3   E May
4   B Feb
7   A Jan
8   D Apr
10  A Mar
11  B Feb
12  E May
15  B Feb
18  C Mar
19  D Apr
20  A Jan
4

3 に答える 3

9

を使用するのではなくrle、それでも方法を次に示します。

dat[with(dat, c(TRUE, diff(as.numeric(interaction(v1, v2))) != 0)), ]

factorこれは、サンプルデータが示すように、列を使用していることを前提としています。

于 2012-12-27T14:34:57.433 に答える
4

ここでは、フィルターを使用した高速ソリューション

dat[(filter(dat,c(-1,1))!= 0)[,1],]
     v1   v2
1     A  Jan
3     E  May
4     B  Feb
7     A  Jan
8     D  Apr
10    A  Mar
11    B  Feb
12    E  May
15    B  Feb
18    C  Mar
19    D  Apr
NA <NA> <NA>

元のデータの最後の値を結果に追加する必要があります。

于 2012-12-27T15:33:22.737 に答える
3

使っrleてこれを思いついた

ind <- cumsum(rle(as.character(dat$v1))$length)
dat[ind, ]

ind連続するエントリの最初または最後のいずれかを示します。

編集:

マシューズのコメントに対する簡単な解決策は次のとおりです。

dat[15, 2] <- "May"
dat[cumsum(rle(paste0(dat$v1, dat$v2))$length), ]
于 2012-12-27T14:40:02.077 に答える