จะทราบได้อย่างไรว่าเวกเตอร์ประกอบด้วยองค์ประกอบเดียวกัน?


12

ฉันจะตรวจสอบได้อย่างไรว่าเวกเตอร์มีองค์ประกอบเดียวกันทั้งหมดหรือไม่

เช่นสมมติว่าฉันมี:

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

ฉันจะแสดงให้เห็นว่าvec1มีองค์ประกอบเดียวกันทั้งหมดได้อย่างไร


diff(vec1)ส่งคืนอะไร
Rui Barradas

1
หรือuniqueองค์ประกอบหนึ่ง
rawr

1
@rawr ตอบเป็นรหัสlength(unique(vec1)) == 1
GWD

คำตอบ:


12

diffตัวเลือกคือ

diff(vec1)

หากองค์ประกอบเท่ากันความแตกต่างจะเป็นศูนย์

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

หรือเปรียบเทียบเวกเตอร์กับองค์ประกอบแรก

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

แก้ไข

หลายวิธีของการกำหนดว่าทุกองค์ประกอบของเวกเตอร์จะเท่ากับถูกโพสต์ให้ดูRHertel , Yuriy Saraykin , tmfmnk นี่คือการทดสอบเปรียบเทียบ

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



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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.