1

最初に出現したインデックスを保持しながら、データ フレーム内の重複行を数えて削除する効率的な方法を探していました。たとえば、データ フレームがある場合:

df<-data.frame(x=c(9.3,5.1,0.6,0.6,8.5,1.3,1.3,10.8),y=c(2.4,7.1,4.2,4.2,3.2,8.1,8.1,5.9))
ddply(df,names(df),nrow)

私にくれます

    x   y   V1
1  0.6 4.2  2
2  1.3 8.1  2
3  5.1 7.1  1
4  8.5 3.2  1
5  9.3 2.4  1
6 10.8 5.9  1

しかし、複製された行の元のインデックスを (行名と共に) 保持したいと考えています。お気に入り:

    x   y   V1
1  9.3 2.4  1
2  5.1 7.1  1
3  0.6 4.2  2
5  8.5 3.2  1
6  1.3 8.1  2
8 10.8 5.9  1

「重複」は元の行名 (ここでは {1 2 3 5 6 8}) を返しますが、出現回数はカウントしません。自分で関数を書いてみましたが、どれもビッグデータを処理するのに十分効率的ではありません。私のデータ フレームには、最大数百万行を含めることができます (ただし、列は通常 5 ~ 10 です)。

4

2 に答える 2

2

で試すことができdata.tableます。「data.frame」を「data.table」( setDT(df)) に変換し、「x」、「y」列でグループ化して、nrow ( .N) を取得します。

library(data.table)
setDT(df)[, list(V1=.N), by = .(x,y)]
#      x   y V1
#1:  9.3 2.4  1
#2:  5.1 7.1  1
#3:  0.6 4.2  2
#4:  8.5 3.2  1
#5:  1.3 8.1  2
#6: 10.8 5.9  1

行 ID が必要な場合は、

setDT(df)[, list(V1= .N, rn=.I[1L]), by = .(x,y)]
#      x   y V1 rn
#1:  9.3 2.4  1  1
#2:  5.1 7.1  1  2
#3:  0.6 4.2  2  3
#4:  8.5 3.2  1  5
#5:  1.3 8.1  2  6
#6: 10.8 5.9  1  8

または

setDT(df, keep.rownames=TRUE)[, list(V1=.N, rn[1L]), .(x,y)]
于 2015-11-26T10:09:01.847 に答える