【发布时间】:2018-08-07 22:16:46
【问题描述】:
我想创建一个允许负索引的向量,例如 -100 到 100。这意味着执行 G[-50] 将选择位置 -50 的元素,而不是除 -50 之外的所有元素。你们能帮我解决这个问题吗? 谢谢。
【问题讨论】:
标签: r
我想创建一个允许负索引的向量,例如 -100 到 100。这意味着执行 G[-50] 将选择位置 -50 的元素,而不是除 -50 之外的所有元素。你们能帮我解决这个问题吗? 谢谢。
【问题讨论】:
标签: r
你可以使用命名向量
x <- 1:201
names(x) <- c(-100:100)
x["-100"]
-100
1
索引将是相同的,但如果您在其周围加上引号,您仍然可以以您想要的方式访问位置
【讨论】:
R 中的数字索引必须是正数,所以没有办法做你想做的事。不过,这里有一些解决方法:
如果您知道最小值是多少(即索引可以从-100 到100),只需将该数字(+1)添加到您的索引中。所以不是df[-100],而是df[1]
您可以将正索引和负索引拆分为列表中的 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
【讨论】:
您可以使用dictionary。
> library(hashmap)
> H <- hashmap(-100:100, 1:201)
> H[[-50]]
[1] 51
【讨论】:
这是一件很奇怪的事情。您可以决定创建您的类来执行此操作。虽然我不建议您继续这样做:因此我将调用该类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] 应该是什么?然后您可以相应地更改功能
【讨论】: