【问题标题】:How can I map an integer to an integer?如何将整数映射到整数?
【发布时间】:2020-02-06 13:40:20
【问题描述】:

我需要将一个整数映射到 R 中的一个整数。 在 python 中,这是字典的工作

>>> a = { 4: 1, 5: 2, 6:3 }
>>> a[5]
2

但 R 中不存在这样的东西。矢量不起作用:

 a<- c(1,2,3)
> a
[1] 1 2 3
> names(a) <- c(5,6,7)
> a
5 6 7 
1 2 3 
> a[[5]]
Error in a[[5]] : subscript out of bounds

列表也不起作用

> a<- list(1,2,3)
> a
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

> names(a) <- c(4, 5, 6)
> a
$`4`
[1] 1

$`5`
[1] 2

$`6`
[1] 3

> a[[6]]
Error in a[[6]] : subscript out of bounds

【问题讨论】:

  • 你刚才叫错了。试试a['5']a[['5']]。这应该适用于列表和命名向量
  • @sotos 这需要我以字符串的形式访问它。
  • 哦,你需要把它称为整数吗?那么你不能因为R会将整数作为索引,而不是作为名称
  • @sotos 我添加了一个 python 示例。我可以为此目的使用任何数据结构吗?如果可能的话,我宁愿不通过字符串。
  • 不,但你应该能够破解它。也许构建一个x &lt;- c(NA, NA, NA, 1, 2, 3) 形式的向量,在这种情况下x[5] 会给你2

标签: r


【解决方案1】:

R中有一些dictionaries

我建议您使用 hashmap 包。

library(hashmap)
H <- hashmap(c(2, 4, 6), c(99, 999, 9999))
H
##   (numeric) => (numeric)     
## [+2.000000] => [+99.000000]  
## [+4.000000] => [+999.000000] 
## [+6.000000] => [+9999.000000]
H[[4]]
# [1] 999

如果你想要“真”整数:

H <- hashmap(c(2L, 4L, 6L), c(99L, 999L, 9999L))
H
## (integer) => (integer)
##       [2] => [99]     
##       [4] => [999]    
##       [6] => [9999] 

【讨论】:

    【解决方案2】:

    为了获得良好的性能,请使用match

    k<-c(5,6,7)
    v<-c(1,2,3)
    
    x<-c(5,5,6)
    
    v[match(x,k)] 
    

    事实上,如果你的v 只是1:n 就足够了

    match(x, k)
    

    match 返回您正在查找的数组中的索引。

    【讨论】:

      【解决方案3】:

      在您的最后一个示例中,这应该有效(string 不是 numeric):

      a <- list(1,2,3)
      names(a) <- c(4, 5, 6)    
      
      a[["6"]]
      a[[as.character(6)]]
      

      【讨论】:

      • 那么唯一的办法就是把键号转换成字符串?
      • 我认为对此没有严格的解决方案(对象)。
      • 整数比较比字符串比较快,而且还要在字符串和整数之间来回切换,这也是性能负担
      【解决方案4】:

      一个不太可能的最佳解决方案是将整数分配到它们在向量中的整数位置:

      a[c(5:7)]<-1:3
      a[6]
      > [1] 2
      

      缺点(或好处,取决于您的需要)是 a[1] 会产生 NA

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多