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