87

21638 個の一意の * 行を持つテーブルがあります。

vocabulary <- read.table("http://socserv.socsci.mcmaster.ca/jfox/Books/Applied-Regression-2E/datasets/Vocabulary.txt", header=T)

このテーブルには 5 つの列があり、最初の列には回答者 ID 番号が含まれています。回答者が 2 回表示されているかどうか、またはすべての回答者が一意であるかどうかを確認したいと考えています。

使用できる一意の ID をカウントするには

length(unique(vocabulary$id))

そして、私が行うかもしれない重複があるかどうかを確認するために

length(unique(vocabulary$id)) == nrow(vocabulary)

TRUE重複がない場合 (ない場合)を返します。

私の質問:

重複の値または行番号を返す直接的な方法はありますか?

さらなる説明:

関数 の使用には解釈の問題がありますduplicated()。これは、「オリジナル」を除いて、厳密な意味での重複のみを返すためです。たとえば、重複する行の数として「5」を返すsum(duplicated(vocabulary$id))場合があります。dim(vocabulary[duplicated(vocabulary$id),])[1]問題は、重複の数しかわからない場合、重複する行の数がわからないことです。「5」は、それぞれ 1 つの重複がある 5 つの行があること、または 5 つの重複がある 1 つの行があることを意味しますか? また、重複の ID や行番号がわからないため、「オリジナル」を見つける手段がありません。


*この調査で ID が重複していないことはわかっていますが、これは良い例です。この質問に対する別の回答を使用すると、「duplicated(vocabulary$id)または」のようtable(vocabulary$id)に干し草の山が画面に出力され、その中から見つけることがまったくできないからです。可能性のあるまれな重複針。

4

5 に答える 5

5

より簡潔な方法で、次のいずれかを使用しrevます。

x[!(!duplicated(x) & rev(!duplicated(rev(x))))]

...ではなくfromLast:

x[!(!duplicated(x) & !duplicated(x, fromLast = TRUE))]

...そして、論理ベクトルまたは元のベクトルの要素のいずれかを提供するヘルパー関数として:

duplicates <- function(x, as.bool = FALSE) {
    is.dup <- !(!duplicated(x) & rev(!duplicated(rev(x))))
    if (as.bool) { is.dup } else { x[is.dup] }
}

ベクトルを渡すデータ フレームとして扱うのtableは便利ですが、読みにくくなる可能性があり、data.table解決策は問題ありませんが、ID のような単純なベクトルを処理するためのベース R ソリューションをお勧めします。

于 2016-03-03T18:47:49.963 に答える