如何用对应于向量的顺序替换字符串中的单词?

时间:2015-11-07 00:01:07

标签: r

例如,我有一个字符串:

myString <- "a c b c c"

和相应的矢量,它有点像字典

mylevel <- c("a", "b", "c") # Means "a" is the first one, "b" is the second, "c" is the third.

我想让新字符串如下所示:

"1 3 2 3 3"

我怎样才能有效地做到这一点?

4 个答案:

答案 0 :(得分:2)

这四种可能性中的任何一种都应该非常有效。第一个字符串将myString字符串拆分为空格,然后使用mylevel将其与fastmatch::fmatch()匹配。然后我们粘贴结果。

s <- strsplit(myString, " ", fixed = TRUE)[[1L]]
paste(fastmatch::fmatch(s, mylevel), collapse = " ")
# [1] "1 3 2 3 3"

另一个想法是使用查找向量,如下所示(使用上面相同的s) -

paste(setNames(seq_along(mylevel), mylevel)[s], collapse = " ")
# [1] "1 3 2 3 3"

或者这是相同的,只有scan()而不是strsplit()

sc <- scan(text = myString, what = "")
paste(setNames(seq_along(mylevel), mylevel)[sc], collapse = " ")
# [1] "1 3 2 3 3"

最后,完全矢量化的替换由 stringi 包提供。在这个答案中,这应该是四种解决方案中最有效的。

library(stringi)
stri_replace_all_fixed(myString, mylevel, seq_along(mylevel), vectorize_all=FALSE)
# [1] "1 3 2 3 3"

答案 1 :(得分:1)

以下是使用match基础R的方法:

sp <-unlist(strsplit(myString, " "))
match(sp,mylevel)
#[1] 1 3 2 3 3

如果你想要一个字符串:

paste(match(sp,mylevel), collapse=" ")
#[1] "1 3 2 3 3"

答案 2 :(得分:1)

我没有发现有必要对这个特定的例子使用mylevel,尽管可能需要将该向量作为一个级别参数添加到因子中,如果级别没有按词法排序:

> paste( as.numeric(factor(scan(text=myString, what="")) ), collapse=" " )
Read 5 items
[1] "1 3 2 3 3"

答案 3 :(得分:0)

  str_new <-''
    for (i in strsplit(myString," ")[[1]]){
         str_new <- paste(str_new,which(mylevel==i))

     }