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 list
is 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 table
wanneer 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.