web-dev-qa-db-ja.com

「より小さい添え字を持つ要素」を含む、すべての重複行の検索

Rのduplicatedは、ベクトルまたはデータフレームの各要素がより小さい添字を持つ要素の複製であるかどうかを示すベクトルを返します。したがって、5行のデータフレームの行3、4、および5が同じ場合、duplicatedはベクトルを提供します

FALSE, FALSE, FALSE, TRUE, TRUE

しかし、この場合、私は実際に取得したい

FALSE, FALSE, TRUE, TRUE, TRUE

つまり、行がlarger添え字を持つ行によって複製されているかどうかを知りたいのです。

95
Lauren Samuels

duplicatedにはfromLast引数があります。 ?duplicatedの「例」セクションは、その使用方法を示しています。 duplicatedを2回呼び出し、1回はfromLast=FALSEで、もう1回はfromLast=TRUEで呼び出し、どちらかがTRUEである行を取得します。


後期編集:再現可能な例を提供しなかったので、@ jbaumsからの親切な貢献によるイラストを紹介します

vec <- c("a", "b", "c","c","c") 
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)]
## [1] "c" "c" "c"
108
Joshua Ulrich

duplicated値のセットをアセンブルし、uniqueを適用してから、%in%でテストする必要があります。いつものように、サンプルの問題はこのプロセスを生き生きとさせます。

> vec <- c("a", "b", "c","c","c")
> vec[ duplicated(vec)]
[1] "c" "c"
> unique(vec[ duplicated(vec)])
[1] "c"
>  vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE  TRUE  TRUE  TRUE
33
42-

同じ質問 がありました。もし私が間違っていなければ、これも答えです。

vec[col %in% vec[duplicated(vec$col),]$col]

どちらの方が速いのか、私が現在使用しているデータセットは、大きな時間差を生じるテストを作成するのに十分な大きさではありません。

3
François M.

データフレーム内の重複した行は、dplyrを使用して取得できます。

_df = bind_rows(iris, head(iris, 20)) # build some test data
df %>% group_by_all() %>% filter(n()>1) %>% ungroup()
_

特定の列を除外するには、代わりにgroup_by_at(vars(-var1, -var2))を使用してデータをグループ化します。

データだけでなく行インデックスが実際に必要な場合は、次のように最初に追加できます。

_df %>% add_rownames %>% group_by_at(vars(-rowname)) %>% filter(n()>1) %>% pull(rowname)
_
2
Holger Brandl

特定の列でどの行が複製されるかに興味がある場合は、plyrアプローチを使用できます。

ddply(df, .(col1, col2), function(df) if(nrow(df) > 1) df else c())

dplyrでカウント変数を追加:

df %>% add_count(col1, col2) %>% filter(n > 1)  # data frame
df %>% add_count(col1, col2) %>% select(n) > 1  # logical vector

重複行の場合(すべての列を考慮):

df %>% group_by_all %>% add_tally %>% ungroup %>% filter(n > 1)
df %>% group_by_all %>% add_tally %>% ungroup %>% select(n) > 1

これらのアプローチの利点は、カットオフとして重複の数を指定できることです。

0
qwr