获取和删除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
是绝对最好的,但这里有一个strsplit
select,因为我还没有看到一个。
> 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式函数regmatches
和regexec
捕获子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"