例如,我有一个字符串:
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"
我怎样才能有效地做到这一点?
答案 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))
}