获取和删除string的第一个字符

我想通过给每个字符分配不同的值来做一些使用string的二维散步。 我打算“popup”一个string的第一个字符,使用它,并重复其余的string。

我怎么能做到这样的事情?

x <- 'hello stackoverflow' 

我想能够做到这样的事情:

 a <- x.pop[1] print(a) 'h' print(x) 'ello stackoverflow' 

请参阅?substring

 x <- 'hello stackoverflow' substring(x, 1, 1) ## [1] "h" substring(x, 2) ## [1] "ello stackoverflow" 

使用pop方法返回一个值并且具有更新存储在x的数据的副作用的想法是来自面向对象编程的一个概念。 所以我们可以使用pop方法创build一个引用类 ,而不是定义一个pop函数来操作字符向量。

 PopStringFactory <- setRefClass( "PopString", fields = list( x = "character" ), methods = list( initialize = function(x) { x <<- x }, pop = function(n = 1) { if(nchar(x) == 0) { warning("Nothing to pop.") return("") } first <- substring(x, 1, n) x <<- substring(x, n + 1) first } ) ) x <- PopStringFactory$new("hello stackoverflow") x ## Reference class object of class "PopString" ## Field "x": ## [1] "hello stackoverflow" replicate(nchar(x$x), x$pop()) ## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w" 

使用stringi包中的这个函数

 > x <- 'hello stackoverflow' > stri_sub(x,2) [1] "ello stackoverflow" 

substring是绝对最好的,但这里有一个strsplitselect,因为我还没有看到一个。

 > x <- 'hello stackoverflow' > strsplit(x, '')[[1]][1] ## [1] "h" 

或等同地

 > unlist(strsplit(x, ''))[1] ## [1] "h" 

你可以把剩下的stringpaste在一起。

 > paste0(strsplit(x, '')[[1]][-1], collapse = '') ## [1] "ello stackoverflow" 

还有stringr包中的str_sub

 x <- 'hello stackoverflow' str_sub(x, 2) # or str_sub(x, 2, str_length(x)) [1] "ello stackoverflow" 

删除第一个字符:

 x <- 'hello stackoverflow' substring(x, 2, nchar(x)) 

想法是select从2开始的所有字符到x中的字符数。 当你在单词或短语中有不同数量的字符时,这一点很重要。

select第一个字母与以前的答案一样微不足道:

 substring(x,1,1) 

另一种方法是使用正则expression式函数regmatchesregexec捕获子expression式。

 # the original example x <- 'hello stackoverflow' # grab the substrings myStrings <- regmatches(x, regexec('(^.)(.*)', x)) 

这将返回整个string,第一个字符和“popup”结果在长度为1的列表中。

 myStrings [[1]] [1] "hello stackoverflow" "h" "ello stackoverflow" 

相当于list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))) 。 也就是说,它包含了所需元素的超集以及完整的string。


添加sapply将允许此方法适用于长度大于1的字符向量。

 # a slightly more interesting example xx <- c('hello stackoverflow', 'right back', 'at yah') # grab the substrings myStrings <- regmatches(x, regexec('(^.)(.*)', xx)) 

这将返回一个列表,匹配的完整string作为第一个元素,以及由()捕获的匹配子expression式作为以下元素。 所以在正则expression式'(^.)(.*)'(^.)匹配第一个字符, (.*)匹配其余字符。

 myStrings [[1]] [1] "hello stackoverflow" "h" "ello stackoverflow" [[2]] [1] "right back" "r" "ight back" [[3]] [1] "at yah" "a" "t yah" 

现在,我们可以使用可靠的sapply + [方法来提取所需的子串。

 myFirstStrings <- sapply(myStrings, "[", 2) myFirstStrings [1] "h" "r" "a" mySecondStrings <- sapply(myStrings, "[", 3) mySecondStrings [1] "ello stackoverflow" "ight back" "t yah"