【问题标题】:How to know if a vector is composed by the same elements?如何知道向量是否由相同的元素组成?
【发布时间】:2020-03-01 16:45:46
【问题描述】:

如何检查向量是否包含所有相同的元素?

例如,假设我有:

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

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

【问题讨论】:

  • diff(vec1) 返回什么?
  • 或一个unique元素
  • @rawr 回答为代码length(unique(vec1)) == 1

标签: r vector unique


【解决方案1】:

一个选项是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()

【讨论】:

    【解决方案2】:

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

    allElementsEqual <- function(x) {!var(x)}
    
    #allElementsEqual(vec1)
    #[1] TRUE
    #allElementsEqual(vec2)
    #[1] FALSE
    

    【讨论】:

      【解决方案3】:

      计算唯一值的数量

      length(unique(vec1))
      

      【讨论】:

        【解决方案4】:

        我们可以从dplyr使用n_distinct

        library(dplyr)
        n_distinct(vec1)
        

        【讨论】:

          【解决方案5】:

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

          sd(vec1) == 0
          
          [1] TRUE
          

          或者使用table():

          length(table(vec1)) == 1
          

          或者使用rle():

          length(rle(vec1)$lengths) == 1
          

          【讨论】:

            【解决方案6】:

            您可以将其转换为一个因子,如果它们都相同,则可以得到应该只有 1 个值的水平。

            vec1 <- (10,20)
            
            vec <- factor(vec1)
            
            levels(vec)
            

            【讨论】:

              【解决方案7】:

              数字向量的另一个快速/有效的选择是使用max() == min()。即,如果最大值等于最小值(默认为na.rm = FALSE),则所有元素都相等:

              vec1 = rep(10,20)
              vec2 = seq(1:20)
              
              max(vec1) == min(vec1)
              [1] TRUE
              max(vec2) == min(vec2)
              [1] FALSE
              

              编辑:请注意,如果可能有NA,则需要对其进行调整以按需处理。另外,附带说明一下,我的机器上的内存分配非常低(我在高达 1e8 的向量上进行了测试,它仍然为零)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-12-02
                • 1970-01-01
                • 2015-01-13
                • 1970-01-01
                • 2017-12-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多