2011-10-18 10 views
9

Ho un frame di dati di due colonne: chiave e valore e vorrei creare un dizionario usando la rispettiva riga di ogni colonna per ogni elemento della tabella dizionario/hash.Come creare un dizionario/tabella hash eseguendo il iterazione attraverso una colonna?

Per quanto ne so, il modo tipico di utilizzare i dizionari/hash R è fare qualcosa di simile a questo.

labels.dic <- c("Id of the item and some other description" = "id") 

Questo funziona perfettamente bene, ma quando provo a farlo utilizzando i valori del frame di dati (nome lbls nell'esempio) non funziona. Perché succede?

labels.dic <- c(lbls[1,1]=lbls[1,2]) 
Error: unexpected '=' in "c(lbls[1,1] =" 
+0

R non fa dizionari, stai cercando di usare un linguaggio in cui non è progettato per essere usato come un carpentiere visto provare a usare un cacciavite per scavare un buco nel terreno. Certo, puoi contorcarti e lavorare sodo per fare qualcosa di simile, ma le persone ti guarderanno in modo divertente. R non è progettato per tali tipi di manipolazione iterativa dei dati. –

risposta

8

Mi sembra che hai ottenuto un po 'di disinformazione. Non sono nemmeno sicuro di quale sia l'idea di questa sintassi per la creazione di una tabella hash.

In ogni caso: per la funzionalità di tipo hashtable, si può prendere in considerazione l'utilizzo di un environment: questi funzionano internamente con una tabella hash (se non ricordo male), quindi fate esattamente quello che volete.

Si potrebbe utilizzare questo qualcosa di simile:

someenv<-new.env() 
someenv[["key"]]<-value 

Data la tua data.frame, qualcosa di simile sarebbe riempirlo:

for(i in seq(nrow(lbls))) 
{ 
    someenv[[ lbls[i,1] ]]<- lbls[i,2] 
} 

(nota: questo richiede che la prima colonna è un personaggio vero e proprio colonna, non un fattore !!)

È quindi possibile ottenere facilmente un valore denominato utilizzando someenv[["nameofinterest"]].

+0

Nick [qui] (http://tolstoy.newcastle.edu.au/R/help/06/02/20391.html) è dove ho visto questa notazione. Ho riempito correttamente il mio dizionario/tabella hash con il dizionario di notazione [[chiave]] <- valore. Ancora non so perché questo funziona in un modo e non nell'altro. Grazie per l'aiuto. – pedrosaurio

+0

OK, capisco cosa intendi. Sono stato scoraggiato da te usando solo 1 coppia chiave/valore nell'esempio. Ancora: gli ambienti dovrebbero avere prestazioni migliori in questo genere di cose. Se le prestazioni non sono un problema, un vettore con un nome (come suggerito da @kohske) o una lista andrà bene. –

+1

@pedrosaurio - Sì, gli ambienti sono molto più veloci in questo quando si hanno più di 1000 voci. 'new.env (hash = TRUE)' è necessario in R 2.12 e precedenti (hanno cambiato in hash = TRUE in 2.13). – Tommy

3

Il modo più semplice è quello di cambiare names dopo la creazione di variabili. Così si può definire una funzione come questa:

cc <- function(name, value) { 
    ret <- c(value) 
    names(ret) <- name 
    ret 
} 

cc(c(letters[1:2], "a name"), c(LETTERS[1:2], "a value")) 

# output like this 
# a   b a name 
# "A"  "B" "a value" 
+1

Il tuo cc esiste già - si chiama setNames. – hadley

+1

Capito. Penso che sia difficile da trovare, però ... – kohske

+2

Ecco perché dovresti leggere 'help (pacchetto = base)' e 'help (pacchetto = stats)';) – hadley

3

Un'altra opzione simile a quella che avete visto con Python o Perl è il pacchetto hash. Vedi: http://cran.r-project.org/web/packages/hash/

Se le tue chiavi sono particolarmente lunghe, ti consiglio di memorizzare due tabelle di hash. Innanzitutto, cancellate la chiave, utilizzando il pacchetto digest e memorizzate un dizionario (tabella hash) che esegue il mapping da digest a chiave (il mapping da chiave a digest è già eseguito dal pacchetto digest ;-)), quindi dal digest al valore che desideri conservare. Questo funziona molto bene per me.

Problemi correlati