【问题标题】:Is there a way to check index limits of a vector in R?有没有办法检查 R 中向量的索引限制?
【发布时间】:2020-10-31 09:16:00
【问题描述】:

我有一个包含 20 个元素的简单向量,其中所有值都是 NA。

a = rep(NA, 20)

在某些特定的时间间隔内,我为 2 分配了一些 NA 值

a[c(1, 8, 15, 20)] = 2

现在,我想分配值 2 到 3 之后的所有值。以下语句工作正常,但它在索引 21 处向向量添加了一个新元素。但是,我不想增加向量的大小。

a[which(a == 2) + 1] <- 3

有没有办法检查这个向量的限制并仅在向量边界内分配值 3?

【问题讨论】:

  • pmin 是获得正确索引的另一个选项:pmin(which(a==2)+1, length(a))
  • 如果他们对您有帮助,也可以考虑接受/支持现有答案。谢谢

标签: r vector indexing


【解决方案1】:

另一种方法是在比较中不做向量的nth 值。相反,我们只会比较n-1

a[which(head(a, -1L)  == 2) + 1] <- 3

【讨论】:

    【解决方案2】:

    以下是我能想到的最简单的方法。

    library(zoo)
    a = rep(NA, 20)
    a[c(1, 8, 15, 20)] = 2
    a[which(a == 2 & index(a) < length(a)) + 1] <- 3
    

    【讨论】:

    • index() 来自什么?我尝试了代码,但它似乎不是基础的一部分。
    • 它是zoo 库的一部分。
    【解决方案3】:

    你可以删除那些大于a长度的索引。

    a <- rep(NA, 20)
    ind <- c(1, 8, 15, 20)
    a[ind] = 2
    new_ind <- ind + 1
    new_ind <- new_ind[new_ind > 0 & new_ind < length(a)]
    a[new_ind] <- 3
    a
    #[1]  2  3 NA NA NA NA NA  2  3 NA NA NA NA NA  2  3 NA NA NA  2
    

    【讨论】:

      【解决方案4】:

      另一种方法是最初存储向量的length,然后根据初始维度选择值。

      a = rep(NA, 20)
      dim_a <- length(a) 
      a[c(1, 8, 15, 20)] = 2
      a[which(a == 2) + 1] <- 3
      
      a[seq_len(dim_a)] #select all elements up until length of initial a
      
      #2  3 NA NA NA NA NA  2  3 NA NA NA NA NA  2  3 NA NA NA  2
      

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 2019-09-28
        • 2017-03-01
        • 1970-01-01
        相关资源
        最近更新 更多