【问题标题】:How to use environments for lookups如何使用环境进行查找
【发布时间】:2013-09-06 08:29:10
【问题描述】:

我的问题建立在将字符串与多个模式匹配的主题之上。 here 讨论的一种解决方案是使用sapply(keywords, grepl, strings, ignore.case=TRUE),它会产生一个二维矩阵。

但是,当将此方法应用于 5K+ 关键字和 60K+ 字符串时,我遇到了严重的速度问题。(我在 12 小时后取消了该过程)。

一个想法是在 R 中使用哈希表或环境。但是,我不知道如何在保持数字索引的同时将我的字符串“翻译/转换”到环境中?

我有strings[1]...直到strings[60000]

e <- new.env(hash=TRUE)

   for (i in 1:length(strings)) {
        assign(x=i, value=strings, envir=e)
    }

由于assign 中的x 必须是一个字符,我不能这样使用它,但我希望你能理解我的想法..我希望能够使用与我的相同数字来索引环境string[...]矢量

感谢您的帮助!

【问题讨论】:

  • 查找字典是您放入环境中的内容,而不是您的字符串。所以关键字是用来查找的。散列(环境)查找是一个两列矩阵/数据框,您可以在其中查找 a 和 b。所以字符串并没有真正去那里。另外我猜真正让你慢下来的是grepl。无论如何,这不是一个可重复的例子。请发布您迄今为止尝试过的数据和代码。请不要仅仅参考上一个问题,为每个问题提供数据。

标签: regex r hash environment-variables


【解决方案1】:

我认为 R 环境的使用不如 perl 哈希 只是因为没有被广泛理解的“习语” 所以。在你的情况下,关键问题是,你真的想要 数字索引?如果是这样,它应该是价值。关键是你 字符串,这就是练习的重点。

e <- new.env(hash=T)
strings <- as.character(chickwts$feed) # note! not unique
sapply(1:length(strings), function(i)assign(strings[i], i, e))
e$horsebean   # returns 10

在这个例子中,只有与每个字符串关联的最后一个索引 被保留,但你可以分配任何可能对每个人有用的东西 键,例如索引向量。

然后,您可以通过多种方式查找数据。您可以正则表达式搜索 例如,使用 ls 获取键,并使用 mget() 检索值:

# find all keys containing 'beans'
ls(e, patt='bean')
# retrieve bean data
mget(ls(e, pat='bean'),e)

【讨论】:

  • 感谢您的回复!但我不明白这如何帮助我执行查找..我需要将grepl 应用于环境值(= 字符串)..sapply(keywords, grepl, e, ignore.case=TRUE) 不起作用。
  • 我添加了一些关于在环境中查找内容的内容,但我对您的要求了解得不够多,不知道它是否有帮助
猜你喜欢
  • 2018-10-07
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2016-04-28
  • 2010-09-08
  • 2019-04-06
  • 2018-09-16
相关资源
最近更新 更多