我试图学习R并且示例问题是要求仅反转字母顺序的字符串部分:
{{1}}
有没有办法识别字母模式来做到这一点?
答案 0 :(得分:4)
这是基于示例中显示的模式的base R
的一种方法。我们将字符串拆分为单个字符('v1'),使用match
查找字符位置(letters
)的字符位置,获取索引的差异并检查它是否相等到1('i1')。使用逻辑向量,我们对向量('v1')进行子集,创建分组变量并基于分组变量反向(rev
)vector
。最后,将paste
个字符组合在一起以获得预期的输出
v1 <- strsplit(str1, "")[[1]]
i1 <- cumsum(c(TRUE, diff(match(v1, letters)) != 1L))
paste(ave(v1, i1, FUN = rev), collapse="")
#[1] "cbatextgfedtext"
或者@alexislaz在评论中提到
v1 = as.integer(charToRaw(str1))
rawToChar(as.raw(ave(v1, cumsum(c(TRUE, diff(v1) != 1L)), FUN = rev)))
#[1] "cbatextgfedtext"
编辑:
1)根据@ alexislaz的评论纠正了一个错误
2)更新了@alexislaz在评论中提出的另一种方法
str1 <- "abctextdefgtext"
答案 1 :(得分:2)
您可以在基地R
中执行此操作vec <- match(unlist(strsplit(s, "")), letters)
x <- c(0, which(diff(vec) != 1), length(vec))
newvec <- unlist(sapply(seq(length(x) - 1), function(i) rev(vec[(x[i]+1):x[i+1]])))
paste0(letters[newvec], collapse = "")
#[1] "cbatextgfedtext"
s <- "abctextdefgtext"
[1] 1 2 3 20 5 24 20 4 5 6 7 20 5 24 20
)[1] 3 2 1 20 5 24 20 7 6 5 4 20 5 24 20
)