從 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
包。
這些技術中的每一種都提供了預期的結果。選擇權在於使用者。