Comment savoir si un vecteur est composé des mêmes éléments?

12

Comment puis-je vérifier si un vecteur a tous les mêmes éléments?

Par exemple, disons que j'ai:

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

Comment puis-je montrer qu'il vec1a tous les mêmes éléments?

Carlo
la source
diff(vec1)renvoie quoi?
Rui Barradas
1
ou un uniqueélément
rawr
1
@rawr réponse en tant que codelength(unique(vec1)) == 1
GWD

Réponses:

12

Une option est diff.

diff(vec1)

Si les éléments sont égaux, leur différence est nulle.

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

Ou comparez le vecteur à son premier élément.

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

Éditer.

Plusieurs façons de déterminer si tous les éléments d'un vecteur sont égaux ont été affichées, voir RHertel , Yuriy Saraykin , tmfmnk . Voici des tests comparatifs.

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

entrez la description de l'image ici

Rui Barradas
la source
7

Utilisez la variance. Si tous les éléments d'un vecteur sont égaux, la variance est nulle:

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

#allElementsEqual(vec1)
#[1] TRUE
#allElementsEqual(vec2)
#[1] FALSE
RHertel
la source
4

compter le nombre de valeurs uniques

length(unique(vec1))
Yuriy Saraykin
la source
2

Nous pouvons utiliser à n_distinctpartir dedplyr

library(dplyr)
n_distinct(vec1)
akrun
la source
1

Vous pouvez le convertir en facteur et obtenir les niveaux qui ne devraient être qu'une seule valeur s'ils sont tous identiques.

vec1 <- (10,20)

vec <- factor(vec1)

levels(vec)
lonelyLearner
la source
1

Vous pouvez également calculer l'écart type et évaluer s'il est nul:

sd(vec1) == 0

[1] TRUE

Ou en utilisant table():

length(table(vec1)) == 1

Ou en utilisant rle():

length(rle(vec1)$lengths) == 1
tmfmnk
la source