获取包含零的数据集范围

时间:2012-05-25 17:55:43

标签: r

这是一个简单的问题。我有一个数值集,其值从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.提前谢谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

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