Как создать словарь / хэш-таблицу, просматривая столбец? - PullRequest
11 голосов
/ 18 октября 2011

У меня есть фрейм данных из двух столбцов: ключ и значение, и я хотел бы создать словарь, используя соответствующую строку каждого столбца для каждого элемента словаря / хэш-таблицы.

Насколько я понимаю, типичный способ использования словарей / хэш-таблиц R - сделать что-то похожее на это.

labels.dic <- c("Id of the item and some other description" = "id")

Это прекрасно работает, но когда я пытаюсь сделать это, используя значения из фрейма данных (в нашем примере с именем lbls ), это не работает. Почему это происходит?

labels.dic <- c(lbls[1,1]=lbls[1,2])
Error: unexpected '=' in "c(lbls[1,1] ="

Ответы [ 3 ]

11 голосов
/ 18 октября 2011

Мне кажется, вы получили некоторую дезинформацию. Я даже не уверен, откуда вы взяли идею этого синтаксиса для создания хеш-таблицы.

В любом случае: для функциональности, подобной хеш-таблице, вы можете рассмотреть возможность использования environment: они работают внутри с хеш-таблицей (если я правильно помню), поэтому делайте то, что хотите.

Вы бы использовали это что-то вроде:

someenv<-new.env()
someenv[["key"]]<-value

Учитывая ваш data.frame, что-то вроде этого заполнит его:

for(i in seq(nrow(lbls)))
{
  someenv[[ lbls[i,1] ]]<- lbls[i,2]
}

(примечание: для этого требуется, чтобы первый столбец был столбцом фактических символов, а не фактором !!)

Затем вы можете легко получить именованное значение, используя someenv[["nameofinterest"]].

3 голосов
/ 20 октября 2011

Еще одна опция, похожая на ту, что вы видели в Python или Perl, - это пакет hash.См .: http://cran.r -project.org / web / packages / hash /

Если ваши ключи очень длинные, я рекомендую хранить две хеш-таблицы.Сначала хешируйте ключ, используя пакет digest, и сохраните словарь (хеш-таблицу), который отображается из дайджеста в ключ (преобразование из ключа в дайджест уже выполняется пакетом digest ;-)), а затем издайджест до значения, которое вы хотите сохранить.Это работает очень хорошо для меня.

3 голосов
/ 18 октября 2011

Самый простой способ - изменить names после создания переменных. Таким образом, вы можете определить функцию следующим образом:

cc <- function(name, value) {
    ret <- c(value)
    names(ret) <- name
    ret
}

cc(c(letters[1:2], "a name"), c(LETTERS[1:2], "a value"))

# output like this
#    a         b    a name 
#   "A"       "B" "a value" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...