2011-10-18 17 views
9

Tengo un marco de datos de dos columnas: clave y valor y me gustaría crear un diccionario utilizando la fila respectiva de cada columna para cada elemento de la tabla diccionario/hash.¿Cómo crear una tabla de diccionario/hash al iterar a través de una columna?

Por lo que yo entiendo, la forma típica de usar diccionarios R/tablas hash es haciendo algo similar a esto.

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

Esto funciona perfectamente bien, pero cuando trato de hacerlo utilizando los valores de la trama de datos (nombre lbls en el ejemplo) no funciona. ¿Por qué pasó esto?

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

R no hace diccionarios, está tratando de usar un lenguaje en el que no está diseñado para ser utilizado como un carpintero visto tratando de usar un destornillador para cavar un hoyo en el suelo. Claro que puedes contorsionarse y trabajar muy duro para hacer algo similar, pero la gente te va a mirar con gracia. R no está diseñado para tales tipos de manipulación iterativa de datos. –

Respuesta

8

Parece que ha recibido información errónea. Ni siquiera estoy seguro de dónde sacas la idea de esa sintaxis para crear una tabla hash.

En cualquier caso: para la funcionalidad de tipo hashtable, puede considerar usar un environment: estos funcionan internamente con una tabla hash (si no recuerdo mal), así que haga todo lo que quiera.

Se podría utilizar este algo como:

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

Dada su data.frame, algo como esto sería llenarlo:

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

(nota: esto requiere que la primera columna es un carácter real columna, no es un factor !!)

A continuación, puede obtener fácilmente un valor con nombre utilizando someenv[["nameofinterest"]].

+0

Nick [aquí] (http://tolstoy.newcastle.edu.au/R/help/06/02/20391.html) es donde vi esta notación. He llenado con éxito mi tabla diccionario/hash con el diccionario de notación [[clave]] <- valor. Aún no sé por qué esto funciona de una manera y no del otro. Gracias por tu ayuda. – pedrosaurio

+0

OK, ya veo lo que quieres decir. Fui pospuesto por ti usando solo 1 par de clave/valor en tu ejemplo. Aún así: se supone que los entornos tienen un mejor rendimiento en este tipo de cosas. Si el rendimiento no es un problema, un vector con nombre (como @kohske sugerido) o una lista funcionarán bien. –

+1

@pedrosaurio - Sí, los entornos SON magnitudes más rápidas cuando tienes varias 1000 entradas. 'new.env (hash = TRUE)' es necesario en R 2.12 y versiones anteriores (cambiaron a hash = TRUE en 2.13). – Tommy

3

La manera más fácil es cambiar names después de crear variables. Por lo tanto, puede definir una función como esta:

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

Su cc ya existe: se llama setNames. – hadley

+1

Lo tengo. Creo que es difícil de encontrar, aunque ... – kohske

+2

Es por eso que deberías leer 'help (package = base)' y 'help (package = stats)';) – hadley

3

Otra opción que es similar a lo que ha visto con Python o Perl es el paquete hash. Ver: http://cran.r-project.org/web/packages/hash/

Si sus claves son especialmente largas, le recomiendo que almacene dos tablas hash. Primero, use la clave hash, use el paquete digest y almacene un diccionario (tabla hash) que mapee desde el resumen hasta la clave (el mapeo desde la clave hasta el resumen ya está hecho por el paquete digest ;-)), y luego desde el resumen hasta el valor que deseas almacenar Este trabajo es muy bueno para mi.

Cuestiones relacionadas