Tenho uma pergunta trivial: não consegui encontrar uma estrutura de dados de dicionário em R, então usei lista (como "palavra" -> número). Portanto, agora estou com problemas para obter a lista de chaves. Alguém sabe?
89
Sim, o list
tipo é uma boa aproximação. Você pode usar names()
em sua lista para definir e recuperar as 'chaves':
> 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"
>
environment
tipo é usado para isso em R, mas é menos comum / menos conhecido.Você nem mesmo precisa de listas se os seus valores "numéricos" forem todos do mesmo modo. Se eu pegar o exemplo de Dirk Eddelbuettel:
As listas são necessárias apenas se seus valores forem de modo misto (por exemplo, caracteres e números) ou vetores.
Para listas e vetores, um elemento individual pode ser subdividido por nome:
Ou para uma lista:
fonte
c(12,22,33)
dessa estrutura R estilo dicionário foo?unlist(lapply(FUN=function(a){foo[[a]]},X = 1:length(foo)))
é muito inconveniente. Alguma função pronta para isso? A questão foi movida para cáPara estender um pouco a resposta de Calimo, apresento mais algumas coisas que você pode achar úteis ao criar este quase dicionários em R:
a) como retornar todos os VALORES do dicionário:
b) verifique se o dicionário CONTÉM CHAVE:
c) como ADICIONAR NOVA chave, par de valores ao dicionário:
resultados:
d) como cumprir o requisito do DICIONÁRIO REAL - que as teclas NÃO PODEM se repetir (TECLAS ÚNICAS)? Você precisa combinar b) ec) e construir a função que valida se existe tal chave, e fazer o que quiser: por exemplo, não permitir a inserção, atualizar o valor se o novo for diferente do antigo ou reconstruir de alguma forma a chave (por exemplo adiciona algum número para que seja único)
e) como EXCLUIR par POR CHAVE do dicionário:
fonte
c(foo, tic2=NULL)
. Alguma solução?A razão de usar dicionários em primeiro lugar é o desempenho. Embora seja correto usar vetores e listas nomeados para a tarefa, o problema é que eles estão se tornando muito lentos e consomem muita memória com mais dados.
No entanto, o que muitas pessoas não sabem é que R tem de fato uma estrutura de dados de dicionário embutida: ambientes com a opção
hash = TRUE
Veja o exemplo a seguir para saber como fazer isso funcionar:
Edit : Com base nesta resposta, escrevi uma postagem no blog com um pouco mais de contexto: http://blog.ephorie.de/hash-me-if-you-can
fonte
O hash do pacote já está disponível: https://cran.r-project.org/web/packages/hash/hash.pdf
Exemplos
fonte
Variação mais curta da resposta de Dirk:
fonte
Vou apenas comentar que você também pode aproveitar muito
table
ao tentar "falsificar" um dicionário, por exemplo,etc.
fonte
as.numeric()
seja necessário. A tabela já é numérica. Você pode obter o mesmo resultado comnames(t[order(t)])