我想通过为每个字符分配不同的值来使用字符串进行一些二维漫游。我打算'弹出'一个字符串的第一个字符,使用它,并重复其余的字符串。
我怎样才能达到这样的目标?
x <- 'hello stackoverflow'
我希望能够做到这样的事情:
a <- x.pop[1]
print(a)
'h'
print(x)
'ello stackoverflow'
答案 0 :(得分:139)
请参阅?substring
。
x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"
使用pop
方法同时返回值并具有更新存储在x
中的数据的副作用的想法,是面向对象编程的一个概念。因此,我们可以使用pop
方法制作reference class,而不是定义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"
答案 1 :(得分:9)
从stringi
包
> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"
答案 2 :(得分:7)
stringr包中还有str_sub
x <- 'hello stackoverflow'
str_sub(x, 2) # or
str_sub(x, 2, str_length(x))
[1] "ello stackoverflow"
答案 3 :(得分:6)
substring
绝对是最好的,但这里有一个strsplit
替代品,因为我还没有见过。
> x <- 'hello stackoverflow'
> strsplit(x, '')[[1]][1]
## [1] "h"
或等效
> unlist(strsplit(x, ''))[1]
## [1] "h"
你可以paste
将其余的字符串重新组合在一起。
> paste0(strsplit(x, '')[[1]][-1], collapse = '')
## [1] "ello stackoverflow"
答案 4 :(得分:3)
删除第一个字符:
x <- 'hello stackoverflow'
substring(x, 2, nchar(x))
Idea是选择从2开始到x中字符数的所有字符。当您在单词或短语中包含不等数量的字符时,这很重要。
如前所述,选择第一个字母是微不足道的:
substring(x,1,1)
答案 5 :(得分:1)
另一种方法是使用正则表达式函数regmatches
和regexec
捕获子表达式。
# the original example
x <- 'hello stackoverflow'
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))
这将返回整个字符串,第一个字符和&#34;弹出&#34;得到一个长度为1的列表。
myStrings
[[1]]
[1] "hello stackoverflow" "h" "ello stackoverflow"
相当于list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))
。也就是说,它包含所需元素的超集以及完整字符串。
添加sapply
将允许此方法适用于长度为&gt;的字符向量。 1。
# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')
# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))
这将返回一个列表,其中匹配的完整字符串作为第一个元素,而()
捕获的匹配子表达式作为以下元素。因此,在正则表达式'(^.)(.*)'
中,(^.)
匹配第一个字符,(.*)
匹配其余字符。
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"