Как я могу сопоставить целое число целому числу? - PullRequest
0 голосов
/ 06 февраля 2020

Мне нужно отобразить целое число на целое число в 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

Ответы [ 4 ]

4 голосов
/ 06 февраля 2020

Есть несколько словарей в R.

Я бы предложил пакет 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 голосов
/ 06 февраля 2020

Для хорошей производительности вы используете 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 возвращает индекс в массиве, в котором вы выполняете поиск.

1 голос
/ 06 февраля 2020

Менее оптимальным возможным решением было бы назначение целых чисел в позиции их целых чисел в векторе:

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

Недостатком (или преимуществом, зависящим от ваших потребностей) является то, что a[1] будет дать NA

1 голос
/ 06 февраля 2020

В вашем последнем примере это должно работать (string не numeric):

a <- list(1,2,3)
names(a) <- c(4, 5, 6)    

a[["6"]]
a[[as.character(6)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...