1

这是一个简单的问题。我有一个值从 0 到 3 的数据框,我想获取数据集的元素数,在这种情况下应该是 4。以下是数据示例:

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))

我试过diff(range(d))了,但不算 0。在此先感谢。

4

3 回答 3

3

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

于 2012-05-25T18:53:32.907 回答
3

diff(range(d))返回最小值和最大值之间的差值,分别为 0 和 3

您要做的是计算集合中有多少元素。尝试length(d)

d <- 0:3
length(d)

包括对这个答案的评论......让代码说话

示例数据:

dataset = 1:136
dataset = dataset %% 4
dim(dataset) <- c(4,34) //Now we have a table
diff(range(dataset))+1

它像你想要的那样返回 4

于 2012-05-25T18:01:18.313 回答
3

鉴于d您现在提供的结构,您可以对此进行逐列计算。

> diff(range(d$X1))+1
[1] 3
> diff(range(d$X1))+1
[1] 3
> diff(range(d$X2))+1
[1] 4
> diff(range(d$X3))+1
[1] 4
> diff(range(d$X4))+1
[1] 3
> diff(range(d$X5))+1
[1] 3
> diff(range(d$X6))+1
[1] 2

或者您可以遍历所有列

> lapply(d, function(dp) {diff(range(dp))+1})
$X1
[1] 3

$X2
[1] 4

$X3
[1] 4

$X4
[1] 3

$X5
[1] 3

$X6
[1] 2

或者,如果您想要所有列的范围,请将其视为矩阵:

> diff(range(as.matrix(d)))+1
[1] 4
于 2012-05-25T18:42:40.463 回答