我已经看到了一些使用函数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关系 ......
答案 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)
)