在R中使用字典/列表

我有一个微不足道的问题:我找不到R中的字典数据结构,所以我用列表来代替(就像“字” – >数字)所以,现在我有问题如何获得键的列表。 有人知道吗?

是的, listtypes是一个很好的近似值。 您可以使用列表中的names()来设置和检索“keys”:

 > foo <- vector(mode="list", length=3) > names(foo) <- c("tic", "tac", "toe") > foo[[1]] <- 12; foo[[2]] <- 22; foo[[3]] <- 33 > foo $tic [1] 12 $tac [1] 22 $toe [1] 33 > names(foo) [1] "tic" "tac" "toe" > 

你甚至不需要列表,如果你的“数字”值都是相同的模式。 如果我拿Dirk Eddelbuettel的例子:

 > foo <- c(12, 22, 33) > names(foo) <- c("tic", "tac", "toe") > foo tic tac toe 12 22 33 > names(foo) [1] "tic" "tac" "toe" 

仅当您的值是混合模式(例如字符和数字)或向量时才需要列表。

对于列表和向量,可以按名称对单个元素进行子集:

 > foo["tac"] tac 22 

或者为一个列表:

 > foo[["tac"]] [1] 22 

为了扩展Calimo的一点回答,我在R中创build这个准词典的时候,

a)如何返回字典的所有VALUES:

 >as.numeric(foo) [1] 12 22 33 

b)检查字典CONTAINS KEY:

 >'tic' %in% names(foo) [1] TRUE 

c)如何添加新的键,值piar字典:

C(FOO,tic2 = 44)

结果:

 tic tac toe tic2 12 22 33 44 

d)如何填写REAL DICTIONARY的要求 – 那个键不能重复(UNIQU KEYS)? 你需要结合b)和c)来构build函数,validation是否有这样的密钥,并做你想做的事情:例如不允许插入,更新值,如果新的不同于旧的,或重build某种程度上的关键(例如增加了一些数字,所以它是唯一的)

e)如何从字典中删除pair BY KEY:

FOO <-foo [其中(FOO!= FOO [[ “TAC”]])]

首先使用字典的原因是性能。 虽然你可以使用命名向量和列表来完成任务,但问题在于它们变得非常慢,而且内存越来越大,需要更多的数据。

然而,许多人不知道的是,R 确实具有内置的字典数据结构:具有选项hash = TRUE

请参阅以下示例以了解如何使其工作:

 # vectorize assign, get and exists for convenience assign_hash <- Vectorize(assign, vectorize.args = c("x", "value")) get_hash <- Vectorize(get, vectorize.args = "x") exists_hash <- Vectorize(exists, vectorize.args = "x") # keys and values key<- c("tic", "tac", "toe") value <- c(1, 22, 333) # initialize hash hash = new.env(hash = TRUE, parent = emptyenv(), size = 100L) # assign values to keys assign_hash(key, value, hash) ## tic tac toe ## 1 22 333 # get values for keys get_hash(c("toe", "tic"), hash) ## toe tic ## 333 1 # alternatively: mget(c("toe", "tic"), hash) ## $toe ## [1] 333 ## ## $tic ## [1] 1 # show all keys ls(hash) ## [1] "tac" "tic" "toe" # show all keys with values get_hash(ls(hash), hash) ## tac tic toe ## 22 1 333 # remove key-value pairs rm(list = c("toe", "tic"), envir = hash) get_hash(ls(hash), hash) ## tac ## 22 # check if keys are in hash exists_hash(c("tac", "nothere"), hash) ## tac nothere ## TRUE FALSE # for single keys this is also possible: # show value for single key hash[["tac"]] ## [1] 22 # create new key-value pair hash[["test"]] <- 1234 get_hash(ls(hash), hash) ## tac test ## 22 1234 # update single value hash[["test"]] <- 54321 get_hash(ls(hash), hash) ## tac test ## 22 54321 

你可能想看看CRAN上的hash 包 。

我只想评论一下,当你试图“伪造”字典的时候,你也可以得到很多的好处,例如

 > x <- c("a","a","b","b","b","c") > (t <- table(x)) x abc 2 3 1 > names(t) [1] "a" "b" "c" > o <- order(as.numeric(t)) > names(t[o]) [1] "c" "a" "b" 

等等

Dirk的答案变化较小:

 # Create a Color Palette Dictionary > color <- c('navy.blue', 'gold', 'dark.gray') > hex <- c('#336A91', '#F3C117', '#7F7F7F') > # Create List > color_palette <- as.list(hex) > # Name List Items > names(color_palette) <- color > > color_palette $navy.blue [1] "#336A91" $gold [1] "#F3C117" $dark.gray [1] "#7F7F7F" 

包的散列现在可用: https : //cran.r-project.org/web/packages/hash/hash.pdf

例子

 h <- hash( keys=letters, values=1:26 ) h <- hash( letters, 1:26 ) h$a # [1] 1 h$foo <- "bar" h[ "foo" ] # <hash> containing 1 key-value pair(s). # foo : bar h[[ "foo" ]] # [1] "bar"