Rのduplicated
は、ベクトルまたはデータフレームの各要素がより小さい添字を持つ要素の複製であるかどうかを示すベクトルを返します。したがって、5行のデータフレームの行3、4、および5が同じ場合、duplicated
はベクトルを提供します
FALSE, FALSE, FALSE, TRUE, TRUE
しかし、この場合、私は実際に取得したい
FALSE, FALSE, TRUE, TRUE, TRUE
つまり、行がlarger添え字を持つ行によって複製されているかどうかを知りたいのです。
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"
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
同じ質問 がありました。もし私が間違っていなければ、これも答えです。
vec[col %in% vec[duplicated(vec$col),]$col]
どちらの方が速いのか、私が現在使用しているデータセットは、大きな時間差を生じるテストを作成するのに十分な大きさではありません。
データフレーム内の重複した行は、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)
_
特定の列でどの行が複製されるかに興味がある場合は、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
これらのアプローチの利点は、カットオフとして重複の数を指定できることです。