【问题标题】:Map substring without the help of libraries and without using regex在没有库的帮助和不使用正则表达式的情况下映射子字符串
【发布时间】:2016-10-27 11:57:54
【问题描述】:

我有一堆像

这样的字符串
string_example="hi 5eme elephant 4eme dark I am"

我想映射这些值

values_to_map=c("2eme","3eme","4eme","5eme")

给那些

new_values=c("2e","3e","4e","5e")

这是一个效果很好的解决方案,但我发现它有点乏味,我想知道是否有更简单的方法无需其他库的帮助(出于某些原因,我需要只使用 RBase 除了 fastmatch 库)。我也不想使用正则表达式,因为我得到了数千万个字符串,而且速度很慢。

library (fastmatch)
string_example="hi 5eme elephant 4eme dark I am"
string_example=str_split(string_example,pattern = " ")[[1]]
to_change=fmatch(string_example,values_to_map)

index=which(!is.na(to_change))
values=new_values[to_change[!is.na(to_change)]]
string_example[index]=values

【问题讨论】:

  • “如何在不使用螺丝刀的情况下拧螺丝?” — 也称为:您的要求毫无意义。 (关于正则表达式:你检查过它实际上很慢吗?正则表达式 可以 被实现得非常快(与手动字符串处理相当),尽管不幸的是许多库不是。)
  • 这可能是@KonradRudolph 的家庭作业。没有任何工作会产生这样的限制。
  • @hrbrmstr 是的:我抱怨的是课程要求,而不是 OP,他只是运气不好。

标签: r string dictionary


【解决方案1】:

我不理解fastmatch 的需要:

`%||%` <- function (x, y) { if (is.na(x)) { y } else { x } }

string_example <- "hi 5eme elephant 4eme dark I am"
values_to_map <- c("2eme","3eme","4eme","5eme")
new_values <- c("2e","3e","4e","5e")
new_values <- setNames(new_values, values_to_map)

spl <- strsplit(string_example, " ")[[1]] 
spl <- unname(sapply(spl, function(x) {
  new_values[x] %||% x
})) 
spl <- paste0(spl, collapse=" ")
spl
## [1] "hi 5e elephant 4e dark I am"

这是非常脆弱的,并且做出了很多假设,主要是由于一个非常模糊的问题以及空洞的要求。如果是家庭作业,请把你的导师指给这里,这样他们就可以看到他们的指导有多差。

这个:

vapply(string_example, function(spl) {
  spl <- strsplit(spl, " ")[[1]] 
  spl <- unname(vapply(spl, function(x) {
    new_values[x] %||% x
  }, character(1))) 
  paste0(spl, collapse=" ")
}, character(1), USE.NAMES=FALSE)

会稍微快一点,并且可以处理字符向量。

【讨论】:

  • 哇,令人印象深刻!不过,不要听懂你所说的(教练等)。谢谢!不知道无名!
  • 是的。 Python 是可憎的。
  • 你在讽刺吗?为什么这么说?
  • 是的。支离破碎。冗长。不一致(远远超过 R)。加上 SO wldnt 让我只回答“是的”
猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多