仅反转R中字符串中的字母模式

时间:2017-04-13 13:59:05

标签: r string vector alphabetical

我试图学习R并且示例问题是要求仅反转字母顺序的字符串部分:

{{1}}

有没有办法识别字母模式来做到这一点?

2 个答案:

答案 0 :(得分:4)

这是基于示例中显示的模式的base R的一种方法。我们将字符串拆分为单个字符('v1'),使用match查找字符位置(letters)的字符位置,获取索引的差异并检查它是否相等到1('i1')。使用逻辑向量,我们对向量('v1')进行子集,创建分组变量并基于分组变量反向(revvector。最后,将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] 1 2 3 20 5 24 20 4 5 6 7 20 5 24 20
  2. 中找到每个字母的位置
  3. 掌握位置后,您会查找连续的数字,并在找到时反转该序列。 ([1] 3 2 1 20 5 24 20 7 6 5 4 20 5 24 20
  4. 最后,你会在最后一行收到回信。