如何在R中创建带有负下标的向量

时间:2018-08-07 22:16:47

标签: r

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

4 个答案:

答案 0 :(得分:3)

您可以使用命名向量

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

-100 
   1 

索引将是相同的,但是如果在其周围加上引号,您仍然可以按照所需的方式访问头寸

答案 1 :(得分:2)

R中的数字索引必须为正数,因此无法执行所需的操作。不过,这里有一些解决方法:

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

  2. ,而不是df[1]
  3. 您可以将正索引和负索引分为两个向量。因此,您可以使用df[-50]代替df[[negative]][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

答案 2 :(得分:1)

您可以使用dictionary

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

答案 3 :(得分:0)

这是一件奇怪的事情。您可以决定创建类来执行此操作。尽管我不建议您继续这样做:因此,我将调用类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]是什么?然后您可以相应地更改功能