эквивалент Python dict в R


83

Я хочу сделать эквивалент 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 - целое число.

Благодаря!


5
Посмотрите на пакет R hashс его функциями доступа, почти подобными Python.
Hans W.

@Chase, который будет стоить O (n). Доступ к элементу Dict постоянный.
anilbey 07

Ответы:


74

Самое близкое к 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()]к работе
3pitt

@MikePalmice Помимо forцикла, который является своего рода опцией практически на всех языках, существует lapply. Есть также связанные вещи с другим синтаксисом, например Map, и целый пакет, purrr для множества вещей функционального программирования.
joran

@MikePalmice, думаю, l[[names(l)[1]]должно работать. В любом случае, вы можете просто повторять вот так: l[[1]]без использования имен. Обратите внимание, что одинарные скобки []возвращают список, а двойные скобки [[]]возвращают объект внутри списка.
Javi_VM 08

1
вау, такая простая вещь на других языках сложна в r? Допустим, у меня есть строка, содержащаяся в переменной. Если я попытаюсь сделать его ключом, он просто выберет имя переменной в качестве имени ключа вместо значения переменной.
wondim

1
@wondim Вы можете установить имена элементов списка из переменной с помощью names(list) <- vector_of namesподмножества присваивания names(list)[1] <- "foo". См. Также setNames().
joran

5

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

Если ваш словарь большой и всего два столбца, это может быть подходящим вариантом. Вот ссылка на ветку talkstats с образцом кода R:

ССЫЛКА НА ХЕШ-ТАБЛИЦУ


data.tableС этого времени скорость поиска по именованным векторам в Note и R значительно улучшилась.
Тайлер Ринкер

5

Если, как в вашем случае, вы просто хотите, чтобы ваш «словарь» хранил значения одного и того же типа, вы можете просто использовать вектор и назвать каждый элемент.

> l <- c(a = 1, b = 7, f = 2)
> l
a b f 
1 7 2

Если вы хотите получить доступ к «ключам», используйте names.

> names(l)
[1] "a" "b" "f"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.