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
或length(unique(...))
取决于您想要如何计算完全由(例如)组成的数据框{0,1,2,4}
- 应该返回 4 还是 5?(正如@Brian Diggs 在他的回答中指出的那样,diff(range(...))+1
它将在矩阵上工作,而无需进一步展平结构——它也可以在unlist()
ed 数据框上工作。)