Làm thế nào để biết nếu một vectơ được sáng tác bởi các yếu tố tương tự?


12

Làm thế nào tôi có thể kiểm tra nếu một vectơ có tất cả các yếu tố giống nhau?

Ví dụ: giả sử tôi có:

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

Làm thế nào tôi có thể chỉ ra rằng vec1có tất cả các yếu tố giống nhau?


diff(vec1)Trả lại cái gì?
Rui Barradas

1
hoặc một uniqueyếu tố
rawr

1
@rawr trả lời dưới dạng mãlength(unique(vec1)) == 1
GWD

Câu trả lời:


12

Một lựa chọn là diff.

diff(vec1)

Nếu các phần tử bằng nhau, sự khác biệt của chúng bằng không.

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

Hoặc so sánh vector với phần tử đầu tiên của nó.

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

Biên tập.

Một số cách xác định xem tất cả các yếu tố của một vectơ có bằng nhau hay không, xem RHertel , Yuriy Saraykin , tmfmnk . Dưới đây là các bài kiểm tra so sánh.

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

nhập mô tả hình ảnh ở đây


7

Sử dụng phương sai. Nếu tất cả các phần tử của một vectơ bằng nhau, phương sai bằng không:

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

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



1

Bạn có thể chuyển đổi nó thành một yếu tố và có được các mức chỉ có 1 giá trị nếu tất cả đều giống nhau.

vec1 <- (10,20)

vec <- factor(vec1)

levels(vec)

1

Bạn cũng có thể tính độ lệch chuẩn và đánh giá xem nó có bằng không:

sd(vec1) == 0

[1] TRUE

Hoặc sử dụng table():

length(table(vec1)) == 1

Hoặc sử dụng rle():

length(rle(vec1)$lengths) == 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.