length(unique(...))
マトリックスまたはデータフレームに適用すると、予期しない(完全に文書化されているものの)ことを実行します。
s <- structure(list(X1 = c(2L, 2L, 2L, 2L, 2L, 1L, 3L, 2L, 2L), X2 = c(1L,
1L, 1L, 2L, 1L, 0L, 2L, 3L, 1L), X3 = c(2L, 1L, 2L, 2L, 0L, 0L,
2L, 3L, 1L), X4 = c(1L, 2L, 2L, 2L, 1L, 2L, 0L, 2L, 2L), X5 = c(1L,
2L, 1L, 2L, 1L, 0L, 1L, 2L, 1L), X6 = c(1L, 2L, 1L, 1L, 1L, 2L,
1L, 2L, 1L)), .Names = c("X1", "X2", "X3", "X4", "X5", "X6"), class = "data.frame", row.names = c(NA,
-9L))
データフレームに適用されると、データフレームunique
内の一意の行を返します。 length()
次に、データフレームの列数をカウントします。したがって、一般的に(反例は考えられません)、これは常にに等しくなりncol(s)
ます。
length(unique(s)) ## 6
unique
行列に適用すると、一意の行も返さlength()
れますが、要素の総数がカウントされるようになりました。データの場合、これは通常、と同等になりncol(s)*nrow(s)
ます。
length(unique(as.matrix(s))) ## 54
この状況で要素に適用する場合unique
は、次のいずれかが必要になる可能性があります。これらはすべて、元のデータフレームを単一のベクトルに折りたたみます。
length(unique(as.vector(as.matrix(s)))) ## 4
length(unique(unlist(s))) ## 4
length(unique(c(as.matrix(s)))) ## 4
(たとえば)完全に構成されたデータフレームをカウントする方法に依存するかどうかdiff(range(x))+1
は、4または5を返す必要がありますか?(@Brian Diggsが彼の回答で指摘しているように、構造をさらに平坦化する必要なしに、行列で機能します。edデータフレームでも機能します。)length(unique(...))
{0,1,2,4}
diff(range(...))+1
unlist()