R:使用“非字符串”键模仿字典的最佳方式

时间:2014-02-06 11:12:36

标签: r dictionary

我已经看到了一些使用函数names在R中模仿字典的方法。但名称/键必须是字符串......

我想要的是一种使用任何类型密钥的有效方法:

假设我有以下字典结构

dico = list(list(dep=list(11, 22), candidates=list(list(grp.id=15, sim.score=0.8))))
dico[[2]] <- list(dep=list(33, 44), candidates=list(list(grp.id=155, sim.score=0.88)))

从密钥为list(33, 44)的字典中检索条目的最佳方法是什么?

比较密钥的运算符为identical(),但我无法弄清楚如何制定请求,但做了类似的事情(使用which查找id):

key = list(33, 44)
which(sapply(dico, function(x) { identical(x$dep, key) } ))

也许,数据结构也应该是其他东西,首先?

任何建议都将不胜感激。


编辑:如果我这样做,Richie的data.framed方法可以完成这项工作:

the_data <- data.frame(
  dep1        = c(11, 33),
  dep2        = c(22, 44),
  candidates  = c( list(list(grp.id=15, sim.score=0.8)), list(list(grp.id=155, sim.score=0.88)) )
)

因为,我需要每个键可以扩展的候选者列表(成对[grp.id, sim.score])。那就是: 1 - &gt; dep与其相关候选人之间的N关系 ......

1 个答案:

答案 0 :(得分:3)

看起来你的数据结构过于复杂。如果每个列表项(一个人?)有四个与之关联的值,请将数据存储在数据框中。

the_data <- data.frame(
  dep1                = c(11, 33),
  dep2                = c(22, 44),
  candidate.grp.id    = c(15, 155),
  candidate.sim.score = c(0.8, 0.88)
)

然后,您可以使用subset或标准索引来检索您想要的内容。

subset(the_data, dep1 == 33 & dep2 == 44)

从你的评论中,我怀疑(不是很清楚)几个候选人可以拥有相同的dep值。在这种情况下,只需重复数据框中的dep值。

所以这个复杂的数据结构:

dico <- list(
  list(
    dep        = list(11, 22), 
    candidates = list(
      list(
        grp.id    = 15, 
        sim.score = 0.8
      )
    )
  ),
  list(
    dep        = list(33, 44), 
    candidates = list(
      list(
        grp.id    = 155, 
        sim.score = 0.88
      )
    )
  ),
  list(
    dep        = list(33, 44), 
    candidates = list(
      list(
        grp.id    = 99, 
        sim.score = 0.99
      )
    )
  )
)

简化为:

the_data <- data.frame(
  dep1                = c(11, 33, 33),
  dep2                = c(22, 44, 44),
  candidate.grp.id    = c(15, 155, 99),
  candidate.sim.score = c(0.8, 0.88, 0.99)
)