从 R 中的字符串中删除第一个字符
R 是众所周知的用于统计分析的编程环境。这意味着分析数字,但统计不仅仅是数字。我们可能需要计算一个单词的实例,或者我们可能需要从字符串中删除第一个字符。
R 提供了许多函数来分析和操作字符串。虽然基本 R 中内置了一些功能,但通过包可以使用更多功能。
本文重点介绍从字符串中删除第一个字符的三种技术。
在深入研究这些技术之前,重要的是要注意这两点。
- 在 R 中,向量元素的索引是从 1 开始的,而不是 0。与大多数编程语言不同,它就像数学中向量和矩阵的索引,最后一个范围索引包含在范围内。
- 本文中的所有示例代码都将使用有效值。这将有助于将文章的重点放在解释的主要概念上。
从字符串中删除第一个字符的技术
我们将探索三种技术来从字符串或字符串向量中删除第一个字符。
- 基础 R
substr()
函数。 - 带有正则表达式的基础 R
sub()
函数。 stringr
包中的str_sub()
函数。
我们将演示每种技术以促进对单个字符串和字符串向量的理解。
我们将使用字典作为示例字符串。我们将使用 R 的组合函数 c()
创建三个字符串的向量。
构成我们向量的词是字典、词库和日记。以下代码创建向量。
示例代码:
myVector = c('dictionary', 'thesaurus', 'diary')
输出:
> myVector = c('dictionary', 'thesaurus', 'diary')
在 R 中使用 substr()
函数
第一种技术将演示基本 R 的 substr()
函数从字符串中删除第一个字符。该功能的使用要点如下。
substr()
函数提取字符串的一部分。- 它需要三个参数。
- 第一个参数是文本字符串。在 R 术语中,字符串是一个字符向量,它的每个字符都有一个位置索引。
- 第二个参数是开始子字符串的字符索引。第一个字符的索引是 1。
- 第三个参数是结束子字符串的字符索引向量。最后一个字符的索引与字符串的长度相同。
下面的示例代码删除了字符串的第一个字符,因为我们从索引 2 开始子字符串并在最后一个字符的索引位置结束子字符串。
示例代码:
substr('dictionary', 2,10)
输出:
> substr('dictionary', 2,10)
[1] "ictionary"
在大多数实际情况下,我们不会使用单个字符串。我们将有一个字符串向量,我们需要从向量中的每个字符串中删除第一个字符。
为了演示字符串向量上的 substr()
函数,我们将介绍一个新函数 nchar()
,它来自基础 R。
nchar()
函数为我们提供了字符串向量中每个元素的字符数。
为什么我们需要这个功能?
要使用 substr()
提取子字符串,我们需要传递停止子字符串的字符的索引。
在我们之前的示例中,我们只想删除第一个字符;为此,我们使用了字符串的最后一个字符的索引位置。在我们的单个单词示例中,我们为最后一个字符的位置提供了一个特定的数值。
当我们有一个不同长度的字符串向量时,我们需要一种通用的方式来指定每个字符串的最后一个字符的索引位置。nchar()
函数允许我们这样做。
例如,nchar('dictionary')
给我们 10
;它是字符串 dictionary
中的字符数。由于在 R 中索引从 1 开始,因此该字符串的最后一个字符的索引位置是 10。
我们继续使用相同的 substr()
函数来处理字符串向量。但是,请注意这种情况下的两个主要区别。
substr()
的第一个参数现在是一个字符串向量。 (它是字符向量的向量。)- 由于
substr()
被应用于每个向量元素,nchar()
传递该元素中的字符数。与过程编程语言不同,没有必要编写循环来遍历每个向量元素。
下面的代码从每个向量元素中删除第一个字符。
示例代码:
substr(myVector, 2, nchar(myVector))
输出:
> substr(myVector, 2, nchar(myVector))
[1] "ictionary" "hesaurus" "iary"
在 R 中使用带有正则表达式的 sub()
函数
正则表达式是指一个非常复杂的字符串模式匹配系统。它是识别字符串模式的有效工具。
关于正则表达式的一般介绍超出了本文的范围;关于这个主题已经写了几本书。
尽管如此,由于我们需要在 sub()
函数中使用正则表达式,所以将只介绍基本功能。
- 点或句号匹配任何字符,任何字符的单个实例。
- 开头的插入符号
^
匹配字符串开头的模式。
使用这两个字符,我们制作了以下两个正则表达式模式:
- 模式 (
.
) 匹配任意一个字符。 - 模式
^
匹配字符串开头的任何一个字符。
base R 的 sub()
函数是一个模式匹配和替换函数,我们将使用正则表达式从字符串中删除第一个字符。
该功能的使用要点如下:
- 函数的形式为
sub('searchpattern', 'replacement', 'string')
。 - 第一个参数是我们搜索的模式。
- 第二个是一旦找到就替换搜索模式的第一个实例的字符串。
- 第三个是我们在其中搜索模式并替换模式的字符串。
- 默认情况下,此功能区分大小写。
- 此函数仅匹配和替换搜索模式的第一个实例。
以下代码说明了以点作为正则表达式(搜索模式)的 sub()
函数。第一个字符,即第一个匹配项,被替换为 A
。
示例代码:
sub('.','A','dictionary')
输出:
> sub('.','A','dictionary')
[1] "Aictionary"
我们的主要任务是从字符串中删除第一个字符而不是替换它。
要使用这种技术删除字符串的第一个字符,我们需要使用一个空字符串 ''
作为第二个参数。看代码。
示例代码:
sub('.','','dictionary')
输出:
> sub('.','','dictionary')
[1] "ictionary"
下一个示例使用我们已经创建的字符串向量演示了 sub()
函数。此代码从向量的每个元素中删除第一个字符。
示例代码:
sub('.','', myVector)
输出:
> sub('.','', myVector)
[1] "ictionary" "hesaurus" "iary"
在继续下一个技术之前,请注意。Base R 有另一个模式匹配和替换函数,gsub()
。
gsub()
匹配并替换搜索模式的所有实例,与 sub()
函数不同,后者匹配并替换搜索模式的第一个实例。
你可能已经注意到,虽然本节介绍了两个正则表达式,但示例代码只使用了一个。
原因是使用 sub()
函数,只有点就足以匹配任何第一个字符,因为它只匹配搜索模式的第一个实例。gsub()
的行为不同;点匹配每个字符。
示例代码:
gsub('.','A','dictionary')
输出:
> gsub('.','A','dictionary')
[1] "AAAAAAAAAA"
我们发现 gsub()
已经用替换字符串'A'
替换了每个字符。
要强制 gsub()
仅匹配字符串开头的搜索模式,我们需要在点之前加上插入符号,如下例所示。
示例代码:
gsub('^.','A','dictionary')
输出:
> gsub('^.','A','dictionary')
[1] "Aictionary"
对于从字符串或字符串向量中仅删除第一个字符的任务,sub()
函数与其相近的对应物 gsub()
相比是一个更简单的选项。
在 R 中使用 stringr
包
stringr
包提供 str_sub()
函数来删除字符串中的第一个字符。
与基本的 R substr()
函数不同,当我们在字符串向量上使用 str_sub()
函数时,我们不需要其他函数,例如 nchar()
来获取最后一个字符的索引位置。
但是,由于 stringr
包提供了此功能,用户需要首先安装该包(一次性任务)并在使用它之前加载它(在每个会话中)。
关于使用 str_sub()
函数的要点如下:
- 该函数接受三个参数。
- 第一个参数是字符串,或字符串向量。
- 第二个参数是从哪里开始子字符串的索引位置。要删除第一个字符,我们需要从索引位置 2 开始。
- 第三个参数是结束子字符串的索引位置。要将所有字符保留到字符串的末尾,我们需要给它最后一个字符的索引位置,即 -1。这就是使此功能特别有用的原因。
当使用基础 R 的 substr()
函数时,我们使用 nchar()
函数计算每个字符串的最后一个字符的索引位置。
但是,str_sub()
函数使用负整数指定从字符串末尾开始的索引位置。
最后一个字符的索引位置是-1,倒数第二个字符的索引位置是-2,以此类推。这个特性允许我们单独使用这个函数来指定我们的子字符串。
例如,str_sub('thesaurus',2,-1)
从原始字符串的索引位置 2 即字母 h 开始提取(保留)子字符串,并保留所有字符直到索引位置 -1 原始字符串,即最后一个字符 s。因此它返回字符串 hesaurus
。
这段代码说明了函数与单个字符串 dictionary
和我们创建的字符串向量一起使用。
示例代码:
# Install the stringr package using the install.packages() function.
# This is a one-time task.
install.packages("stringr")
# Load the stringr package in each R session using the library() function.
library(stringr)
# Use of the str_sub() function on a string -- a character vector.
str_sub('dictionary', 2,-1)
# Use of the str_sub() function on a vector of strings.
str_sub(myVector, 2,-1) # Removes the first character.
输出(安装和加载包后):
> # Use of the str_sub() function on a string -- a character vector.
> str_sub('dictionary', 2,-1)
[1] "ictionary"
>
> # Use of the str_sub() function on a vector of strings.
> str_sub(myVector, 2,-1) # Removes the first character.
[1] "ictionary" "hesaurus" "iary"
获得帮助
RStudio 可以方便地获取有关任何函数或命令的更多信息。
点击 Help > R Help
以在 RStudio 界面右下方的 Files / Plots / Packages / Help / Viewer
窗口中调出帮助窗格。
使用本页顶部的搜索框搜索本文中提到的任何功能。不要在搜索框中输入函数名称后的括号。
单击 Help > Search R Help
将光标置于此页面的搜索框中。
结论
有几种技术可用于从字符串中删除第一个字符。基本 R substr()
函数很容易获得,但需要另一个基本 R 函数,nchar()
函数,用于字符串向量。
sub()
函数功能强大,但它的所有功能和复杂性并不需要删除字符串的第一个字符这样简单的任务。str_sub()
函数非常方便,但需要安装和加载 stringr
包。
这些技术中的每一种都提供了预期的结果。选择权在于用户。