如何知道向量是否由相同的元素组成?


12

如何检查向量是否具有相同的元素?

例如,假设我有:

vec1 = rep(10,20)
vec2 = seq(1:20)

我如何证明它vec1具有所有相同的元素?


diff(vec1)返回什么?
瑞Barradas的

1
或一个unique元素
Rawr

1
@rawr答案作为代码length(unique(vec1)) == 1
GWD

Answers:


12

一个选项是diff

diff(vec1)

如果元素相等,则它们的差为零。

all(diff(vec1) == 0)
#[1] TRUE

或者将向量与其第一个元素进行比较。

all(vec1 == vec1[1])
#[1] TRUE

编辑。

发布了确定向量的所有元素是否相等的几种方法,请参见RHertelYuriy Saraykintmfmnk。这是比较测试。

library(microbenchmark)
library(ggplot2)

f <- function(n){
  x <- rep(10, n)
  mb <- microbenchmark(
    var = var(x) == 0,
    sd = sd(x) == 0,
    diff = all(diff(x) == 0),
    extract = all(x == x[1]),
    unique = length(unique(x)) == 1
  )
  mb
}

sizes <- c(10, 100, seq(1e3, 1e4, by = 1e3))
mb_list <- lapply(sizes, f)
names(mb_list) <- sizes

res <- lapply(seq_along(mb_list), function(i){
  agg <- aggregate(time ~ expr, mb_list[[i]], median)
  agg$size <- sizes[i]
  agg
})
res <- do.call(rbind, res)

ggplot(res, aes(size, time, colour = expr)) +
  geom_point() +
  geom_line()

在此处输入图片说明


7

使用方差。如果向量的所有元素都相等,则方差为零:

allElementsEqual <- function(x) {!var(x)}

#allElementsEqual(vec1)
#[1] TRUE
#allElementsEqual(vec2)
#[1] FALSE


2

我们可以使用n_distinctdplyr

library(dplyr)
n_distinct(vec1)

1

您可以将其转换为一个因子,并获得相同的水平,该水平应仅为1值。

vec1 <- (10,20)

vec <- factor(vec1)

levels(vec)

1

您还可以计算标准偏差并评估其是否为零:

sd(vec1) == 0

[1] TRUE

或使用table()

length(table(vec1)) == 1

或使用rle()

length(rle(vec1)$lengths) == 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.