Werken met woordenboeken/lijsten in R

Ik heb een triviale vraag: ik kon geen woordenboekgegevensstructuur vinden in R, dus gebruikte ik in plaats daarvan lijst (zoals “woord”->nummer)
Dus op dit moment heb ik een probleem hoe ik de lijst met sleutels kan krijgen.
Weet iemand het?


Antwoord 1, autoriteit 100%

Ja, het type listis een goede benadering. U kunt names()in uw lijst gebruiken om de ‘sleutels’ in te stellen en op te halen:

> 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"
> 

Antwoord 2, autoriteit 48%

Je hebt zelfs geen lijsten nodig als je “getal”-waarden allemaal van dezelfde modus zijn. Als ik het voorbeeld van Dirk Eddelbuettel neem:

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

Lijsten zijn alleen vereist als uw waarden een gemengde modus hebben (bijvoorbeeld tekens en cijfers) of vectoren.

Voor zowel lijsten als vectoren kan een afzonderlijk element op naam worden gezet:

> foo["tac"]
tac 
 22 

Of voor een lijst:

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

Antwoord 3, autoriteit 15%

Om een klein antwoord van Calimo uit te breiden, presenteer ik nog een paar dingen die je misschien handig vindt bij het maken van deze quasi-woordenboeken in R:

a) hoe u alle WAARDEN van het woordenboek kunt retourneren:

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

b) controleer of woordenboek BEVAT SLEUTEL:

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

c) hoe een NIEUWE sleutel, waardepaar toe te voegen aan woordenboek:

c(foo,tic2=44)

resultaten:

tic       tac       toe     tic2
12        22        33        44 

d) hoe te voldoen aan de eis van ECHT WOORDENBOEK – dat sleutels NIET kunnen worden herhaald (UNIEKE SLEUTELS)? U moet b) en c) combineren en een functie bouwen die valideert of er zo’n sleutel is, en doen wat u wilt: bijv. geen invoeging toestaan, waarde bijwerken als de nieuwe verschilt van de oude, of op de een of andere manier een sleutel opnieuw opbouwen (bijv. voegt er een nummer aan toe zodat het uniek is)

e) hoe een paar PER SLEUTEL te VERWIJDEREN uit het woordenboek:

foo<-foo[which(foo!=foo[[“tac”]])]


Antwoord 4, autoriteit 14%

De reden voor het gebruik van woordenboeken is in de eerste plaats de prestaties. Hoewel het juist is dat je benoemde vectoren en lijsten voor de taak kunt gebruiken, is het probleem dat ze behoorlijk traag worden en geheugenhongerig worden met meer gegevens.

Maar wat veel mensen niet weten, is dat R inderdaadeen ingebouwde woordenboekgegevensstructuur heeft: omgevingen met de optie hash = TRUE

Bekijk het volgende voorbeeld om het te laten werken:

# 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

Bewerken: op basis van dit antwoord schreef ik een blogpost met wat meer context: http://blog.ephorie.de/hash-me-if-you-can


Antwoord 5, autoriteit 8%

Het pakket hashis nu beschikbaar:
https://cran.r-project.org/web/packages/hash /hash.pdf

Voorbeelden

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"

Antwoord 6, autoriteit 6%

Kortere variant van Dirk’s antwoord:

# 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"

Antwoord 7, autoriteit 3%

Ik wil alleen zeggen dat je veel kilometers kunt halen uit tablewanneer je ook een woordenboek probeert te “faken”, bijvoorbeeld

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

enz.

Other episodes