Я хочу сделать эквивалент python dict в R. В принципе, в python у меня есть:
visited = {}
if atom_count not in visited:
Do stuff
visited[atom_count] = 1
Идея в том, что если я увидел этот конкретный атом_count, я посетил [atom_count] = 1. Таким образом, если я снова увижу это atom_count, я не буду «делать что-нибудь». Atom_Count - целое число.
Благодаря!
python
r
dictionary
user1357015
источник
источник
hash
с его функциями доступа, почти подобными Python.Ответы:
Самое близкое к Python dict в R - это просто список. Как и большинство типов данных R, списки могут иметь атрибут имен, который позволяет спискам действовать как набор пар имя-значение:
> l <- list(a = 1,b = "foo",c = 1:5) > l $a [1] 1 $b [1] "foo" $c [1] 1 2 3 4 5 > l[['c']] [1] 1 2 3 4 5 > l[['b']] [1] "foo"
Теперь обычное заявление об отказе от ответственности: они не совсем то же самое; будут отличия. Таким образом, вы вызовете разочарование, если попытаетесь буквально использовать списки точно так же, как вы могли бы использовать dict в python.
источник
l$names(l)[1]
явно терпит неудачу. Я тоже не смог приступитьl[which()]
к работеfor
цикла, который является своего рода опцией практически на всех языках, существуетlapply
. Есть также связанные вещи с другим синтаксисом, напримерMap
, и целый пакет, purrr для множества вещей функционального программирования.l[[names(l)[1]]
должно работать. В любом случае, вы можете просто повторять вот так:l[[1]]
без использования имен. Обратите внимание, что одинарные скобки[]
возвращают список, а двойные скобки[[]]
возвращают объект внутри списка.names(list) <- vector_of names
подмножества присваиванияnames(list)[1] <- "foo"
. См. ТакжеsetNames()
.Я считаю, что использование хеш-таблицы (создание новой среды) может быть решением вашей проблемы. Я напечатал, как это сделать, но я сделал это вчера на talkstats.com.
Если ваш словарь большой и всего два столбца, это может быть подходящим вариантом. Вот ссылка на ветку talkstats с образцом кода R:
ССЫЛКА НА ХЕШ-ТАБЛИЦУ
источник
data.table
С этого времени скорость поиска по именованным векторам в Note и R значительно улучшилась.Если, как в вашем случае, вы просто хотите, чтобы ваш «словарь» хранил значения одного и того же типа, вы можете просто использовать вектор и назвать каждый элемент.
> l <- c(a = 1, b = 7, f = 2) > l a b f 1 7 2
Если вы хотите получить доступ к «ключам», используйте
names
.> names(l) [1] "a" "b" "f"
источник