【问题标题】:how to create vector with negative subscript in R如何在R中创建带负下标的向量
【发布时间】:2018-08-07 22:16:46
【问题描述】:

我想创建一个允许负索引的向量,例如 -100 到 100。这意味着执行 G[-50] 将选择位置 -50 的元素,而不是除 -50 之外的所有元素。你们能帮我解决这个问题吗? 谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用命名向量

    x <- 1:201
    names(x) <- c(-100:100)
    x["-100"]
    
    -100 
       1 
    

    索引将是相同的,但如果您在其周围加上引号,您仍然可以以您想要的方式访问位置

    【讨论】:

      【解决方案2】:

      R 中的数字索引必须是正数,所以没有办法做你想做的事。不过,这里有一些解决方法:

      1. 如果您知道最小值是多少(即索引可以从-100100),只需将该数字(+1)添加到您的索引中。所以不是df[-100],而是df[1]

      2. 您可以将正索引和负索引拆分为列表中的 2 个向量。因此,您应该使用 df[[negative]][50] 而不是 df[-50]

      看这个例子:

      df <- list('pos' = c(1, 2, 3, 4, 5),
                 'neg' = c(-1, -2, -3, -4, -5))
      
      neg_index <- function(df, i) {
          if (i > 0) {
              return(df[['pos']][i])
          } else if (i < 0) {
              return(df[['neg']][abs(i)])
          } else {
              return(NULL)
          }
      }
      
      neg_index(df, -2)
      [1] -2
      
      neg_index(df, 4)
      [1] 4
      

      【讨论】:

        【解决方案3】:

        您可以使用dictionary

        > library(hashmap)
        > H <- hashmap(-100:100, 1:201)
        > H[[-50]]
        [1] 51
        

        【讨论】:

          【解决方案4】:

          这是一件很奇怪的事情。您可以决定创建您的类来执行此操作。虽然我不建议您继续这样做:因此我将调用该类weird

          weird = function(x,pos = NULL){
            stopifnot(length(x)%%2==1)
            s = seq_along(x)
            names(x) = s-floor(median(s))
            class(x) = "weird"
            x
          }
          print.weird = function(x) print(c(unname(x)))
          `[.weird` = function(i,j) unname(.Primitive("[")(unclass(i),as.character(j)))
          
          
          
          (s = weird(-10:10))
           [1] -10  -9  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6   7
          [19]   8   9  10
          

          如你所见,这只是一个从-10:10开始的法线向量,你看不到的是这个s的类是weird。你可以通过class(s)进行检查

          现在就做:

          s[-1]
          [1] -1
          > s[-10]
          [1] -10
          > s[0]
          [1] 0
          > s[3]
          [1] 3
          

          另外,如果你需要使用它,那么你必须指定索引0 应该在哪里。即例如m = 1:5 m[0] 应该是什么?然后您可以相应地更改功能

          【讨论】:

            猜你喜欢
            • 2014-04-12
            • 2022-11-24
            • 2020-01-27
            • 2011-02-07
            • 1970-01-01
            • 2022-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多