78

R で複製された関数は、重複行検索を実行します。重複を削除したい場合は、書き込むだけdf[!duplicated(df),]で重複がデータ フレームから削除されます。

しかし、重複データのインデックスを見つける方法は? ある行で TRUE を返す場合duplicated、これはデータ フレーム内でそのような行が 2 番目に発生したことを意味し、そのインデックスは簡単に取得できます。この行の最初の出現のインデックスを取得する方法は? または、つまり、複製された行が同一であるインデックス?

data.frame でループを作成することもできますが、この質問にはもっとエレガントな答えがあると思います。

4

2 に答える 2

115

次に例を示します。

df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1))

duplicated(df) | duplicated(df, fromLast = TRUE)
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

使い方?

この関数duplicated(df)は、元のデータ内の重複要素を判別します。fromLast = TRUEは「重複は裏側から考えるべき」ということを示しています。結果として得られる 2 つの論理ベクトルは、それらの少なくとも 1 つの a が重複した値を示す|ため、使用して結合されます。TRUE

于 2012-09-19T13:13:23.797 に答える
20

キー付きのdata.tableを使用している場合は、次の洗練された構文を使用できます

library(data.table)
DT <- data.table(A = rep(1:3, each=4), 
                 B = rep(1:4, each=3), 
                 C = rep(1:2, 6), key = "A,B,C")

DT[unique(DT[duplicated(DT)]),which=T]

開梱するには

  • DT[duplicated(DT)]重複している行をサブセット化します。

  • unique(...)重複した行の一意の組み合わせのみを返します。これは、2 つ以上の重複がある場合に対処します (重複重複、3 重複など)。

  • DT[..., which = T] 重複した行を元の行とマージしwhich=T、行番号を返します (which = Tデータを返すだけではありません)。

使用することもできます

 DT[,count := .N,by = list(A,B,C)][count>1, which=T]
于 2012-09-24T00:20:22.343 に答える