
處理文本是每一種計(jì)算機(jī)語言都應(yīng)該具備的功能,但不是每一種語言都側(cè)重于處理文本。R語言是統(tǒng)計(jì)的語言,處理文本不是它的強(qiáng)項(xiàng),perl語言這方面的功能比R不知要強(qiáng)多少倍。幸運(yùn)的是R語言的可擴(kuò)展能力很強(qiáng),DNA/RNA/AA等生物序列現(xiàn)在已經(jīng)可以使用R來處理。
nchar 字符的個數(shù)
toupper 轉(zhuǎn)換為大寫字符
tolower 轉(zhuǎn)換為小寫字符
substr 求字符串的字串
grep 基于正則表達(dá)式的匹配
sub 基于正則表達(dá)式的替換
strsplit 字符串分割
paste 字符向量連接
match 匹配元素位置組成的向量
R語言處理文本的能力雖然不強(qiáng),但適當(dāng)用用還是可以大幅提高工作效率的,而且有些文本操作還不得不用。高效處理文本少不了正則表達(dá)式(regular expression),雖然R在這方面先天不高效,但它處理字符串的絕大多數(shù)函數(shù)都使用正則表達(dá)式。
0、正則表達(dá)式簡介:
正則表達(dá)式不是R的專屬內(nèi)容,所以用0編號,這里也只簡單介紹,更詳細(xì)的內(nèi)容請查閱其他文章。
正則表達(dá)式是用于描述/匹配一個文本集合的表達(dá)式。
1. 所有英文字母、數(shù)字和很多可顯示的字符本身就是正則表達(dá)式,用于匹配它們自己。比如 'a' 就是匹配字母 'a' 的正則表達(dá)式
2. 一些特殊的字符在正則表達(dá)式中不在用來描述它自身,它們在正則表達(dá)式中已經(jīng)被“轉(zhuǎn)義”,這些字符稱為“元字符”。
perl類型的正則表達(dá)式中被轉(zhuǎn)義的字符有:. \ | ( ) [ ] { } ^ $ * + ?。被轉(zhuǎn)義的字符已經(jīng)有特殊的意義,如點(diǎn)號 . 表示任意字符;
方括號表示選擇方括號中的任意一個(如[a-z] 表示任意一個小寫字符);^ 放在表達(dá)式開始出表示匹配文本開始位置,放在方括號內(nèi)開始處表示非方括號內(nèi)的任一字符;大括號表示前面的字符或表達(dá)式的重復(fù)次數(shù);| 表示可選項(xiàng),即 | 前后的表達(dá)式任選一個。
3. 如果要在正則表達(dá)式中表示元字符本身,比如我就要在文本中查找問號‘?’, 那么就要使用引用符號(或稱換碼符號),一般是反斜杠 '\'。需要注意的是,在R語言中得用兩個反斜杠即 ‘\\’,如要匹配括號就要寫成 ’\\(\\)‘
4. 不同語言或應(yīng)用程序(事實(shí)上很多規(guī)則都通用)定義了一些特殊的元字符用于表示某類字符,
如 \d 表示數(shù)字0-9,
\D 表示非數(shù)字,
\s 表示空白字符(包括空格、制表符、換行符等),
\S 表示非空白字符,
\w 表示字(字母和數(shù)字),
\W 表示非字,
\< 和 \> 分別表示以空白字符開始和結(jié)束的文本。
5. 正則表達(dá)式符號運(yùn)算順序:圓括號括起來的表達(dá)式最優(yōu)先,然后是表示重復(fù)次數(shù)的操作(即:* + {} ),接下來是連接運(yùn)算(其實(shí)就是幾個字符放在一起,如abc),最后是表示可選項(xiàng)的運(yùn)算(|)。所以 'foot|bar' 可以匹配’foot‘或者’bar‘,但是 'foot|ba{2}r'匹配的是’foot‘或者’baar‘。
元字符
描述
\
將下一個字符標(biāo)記符、或一個向后引用、或一個八進(jìn)制轉(zhuǎn)義符。例如,“\\n”匹配\n?!癨n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當(dāng)于多種編程語言中都有的“轉(zhuǎn)義字符”的概念。
^
匹配輸入字符串的開始位置。如果設(shè)置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。
$
匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。
*
匹配前面的子表達(dá)式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。
+
匹配前面的子表達(dá)式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價于{1,}。
?
匹配前面的子表達(dá)式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價于{0,1}。
{n}
n是一個非負(fù)整數(shù)。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。
{n,}
n是一個非負(fù)整數(shù)。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價于“o+”。“o{0,}”則等價于“o*”。
{n,m}
m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o?!皁{0,1}”等價于“o?”。請注意在逗號和兩個數(shù)之間不能有空格。
?
當(dāng)該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。
.點(diǎn)
匹配除“\r\n”之外的任何單個字符。要匹配包括“\r\n”在內(nèi)的任何字符,請使用像“[\s\S]”的模式。
(pattern)
匹配pattern并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“”或“”。
(?:pattern)
非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達(dá)式。
(?=pattern)
非獲取匹配,正向肯定預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。
(?!pattern)
非獲取匹配,正向否定預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern)
非獲取匹配,反向肯定預(yù)查,與正向肯定預(yù)查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)
非獲取匹配,反向否定預(yù)查,與正向否定預(yù)查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。這個地方不正確,有問題
此處用或任意一項(xiàng)都不能超過2位,如“(?<!95|98|NT|20)Windows正確,“(?<!95|980|NT|20)Windows 報(bào)錯,若是單獨(dú)使用則無限制,如(?<!2000)Windows 正確匹配
x|y
匹配x或y。例如,“z|food”能匹配“z”或“food”(此處請謹(jǐn)慎)?!?z|f)ood”則匹配“zood”或“food”。
[xyz]
字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]
負(fù)值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]
字符范圍。匹配指定范圍內(nèi)的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內(nèi)的任意小寫字母字符。
注意:只有連字符在字符組內(nèi)部時,并且出現(xiàn)在兩個字符之間時,才能表示字符的范圍; 如果出字符組的開頭,則只能表示連字符本身.
[^a-z]
負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內(nèi)的任意字符。
\b
匹配一個單詞邊界,也就是指單詞和空格間的位置(即正則表達(dá)式的“匹配”有兩種概念,一種是匹配字符,一種是匹配位置,這里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B
匹配非單詞邊界?!癳r\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx
匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的“c”字符。
\d
匹配一個數(shù)字字符。等價于[0-9]。grep 要加上-P,perl正則支持
\D
匹配一個非數(shù)字字符。等價于[^0-9]。grep要加上-Pperl正則支持
\f
匹配一個換頁符。等價于\x0c和\cL。
\n
匹配一個換行符。等價于\x0a和\cJ。
\r
匹配一個回車符。等價于\x0d和\cM。
\s
匹配任何不可見字符,包括空格、制表符、換頁符等等。等價于[ \f\n\r\t\v]。
\S
匹配任何可見字符。等價于[^ \f\n\r\t\v]。
\t
匹配一個制表符。等價于\x09和\cI。
\v
匹配一個垂直制表符。等價于\x0b和\cK。
\w
匹配包括下劃線的任何單詞字符。類似但不等價于“[A-Za-z0-9_]”,這里的"單詞"字符使用Unicode字符集。
\W
匹配任何非單詞字符。等價于“[^A-Za-z0-9_]”。
\xn
匹配n,其中n為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個數(shù)字長。例如,“\x41”匹配“A”?!癨x041”則等價于“\x04&1”。正則表達(dá)式中可以使用ASCII編碼。
\num
匹配num,其中num是一個正整數(shù)。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個連續(xù)的相同字符。
\n
標(biāo)識一個八進(jìn)制轉(zhuǎn)義值或一個向后引用。如果\n之前至少n個獲取的子表達(dá)式,則n為向后引用。否則,如果n為八進(jìn)制數(shù)字(0-7),則n為一個八進(jìn)制轉(zhuǎn)義值。
\nm
標(biāo)識一個八進(jìn)制轉(zhuǎn)義值或一個向后引用。如果\nm之前至少有nm個獲得子表達(dá)式,則nm為向后引用。如果\nm之前至少有n個獲取,則n為一個后跟文字m的向后引用。如果前面的條件都不滿足,若n和m均為八進(jìn)制數(shù)字(0-7),則\nm將匹配八進(jìn)制轉(zhuǎn)義值nm。
\nml
如果n為八進(jìn)制數(shù)字(0-7),且m和l均為八進(jìn)制數(shù)字(0-7),則匹配八進(jìn)制轉(zhuǎn)義值nml。
\un
匹配n,其中n是一個用四個十六進(jìn)制數(shù)字表示的Unicode字符。例如,\u00A9匹配版權(quán)符號(©)。
\p{P}
小寫 p 是 property 的意思,表示 Unicode 屬性,用于 Unicode 正表達(dá)式的前綴。中括號內(nèi)的“P”表示Unicode 字符集七個字符屬性之一:標(biāo)點(diǎn)字符。
其他六個屬性:
L:字母;
M:標(biāo)記符號(一般不會單獨(dú)出現(xiàn));
Z:分隔符(比如空格、換行等);
S:符號(比如數(shù)學(xué)符號、貨幣符號等);
N:數(shù)字(比如阿拉伯?dāng)?shù)字、羅馬數(shù)字等);
C:其他字符。
*注:此語法部分語言不支持,例:javascript。
< > 匹配詞(word)的開始(<)和結(jié)束(>)。例如正則表達(dá)式<the>能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是所有的軟件都支持的。
( ) 將( 和 ) 之間的表達(dá)式定義為“組”(group),并且將匹配這個表達(dá)式的字符保存到一個臨時區(qū)域(一個正則表達(dá)式中最多可以保存9個),它們可以用 \1 到\9 的符號來引用。
| 將兩個匹配條件進(jìn)行邏輯“或”(Or)運(yùn)算。例如正則表達(dá)式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字符不是所有的軟件都支持的。
+ 匹配1或多個正好在它之前的那個字符。例如正則表達(dá)式9+匹配9、99、999等。注意:這個元字符不是所有的軟件都支持的。
? 匹配0或1個正好在它之前的那個字符。注意:這個元字符不是所有的軟件都支持的。
{i} {i,j} 匹配指定數(shù)目的字符,這些字符是在它之前的表達(dá)式定義的。例如正則表達(dá)式A[0-9]{3} 能夠匹配字符"A"后面跟著正好3個數(shù)字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達(dá)式[0-9]{4,6} 匹配連續(xù)的任意4個、5個或者6個數(shù)字
(摘自《正則表達(dá)式之道》)
————————————————————————————————————————————————————————
一、字符數(shù)統(tǒng)計(jì)和字符翻譯
nchar這個函數(shù)簡單,統(tǒng)計(jì)向量中每個元素的字符個數(shù),注意這個函數(shù)和length函數(shù)的差別:
nchar是向量元素的字符個數(shù),而length是向量長度(向量元素的個數(shù))。其他沒什么需要說的。
> x <- c("Hellow", "World", "!")
> nchar(x)
[1] 6 5 1
> length(''); nchar('')
[1] 1
[1] 0
另外三個函數(shù)用法也很簡單:
> DNA <- "AtGCtttACC"
> tolower(DNA)
[1] "atgctttacc"
> toupper(DNA)
[1] "ATGCTTTACC"
> chartr("Tt", "Uu", DNA)
[1] "AuGCuuuACC"
> chartr("Tt", "UU", DNA)
[1] "AUGCUUUACC"
————————————————————————————————————————————————————————
二、字符串連接
paste應(yīng)該是R中最常用字符串函數(shù)了,也是R字符串處理函數(shù)里面非常純的不使用正則表達(dá)式的函數(shù)(因?yàn)橛貌恢?。它相?dāng)于其他語言的strjoin,但是功能更強(qiáng)大。它把向量連成字串向量,其他類型的數(shù)據(jù)會轉(zhuǎn)成向量,但不一定是你要的結(jié)果:
> paste("CK", 1:6, sep="")
[1] "CK1" "CK2" "CK3" "CK4" "CK5" "CK6"
> x <- list(a="aaa", b="bbb", c="ccc")
> y <- list(d=1, e=2)
> paste(x, y, sep="-") #較短的向量被循環(huán)使用
[1] "aaa-1" "bbb-2" "ccc-1"
> z <- list(x,y)
> paste("T", z, sep=":") #這樣的結(jié)果不知合不合用
[1] "T:list(a = \"aaa\", b = \"bbb\", c = \"ccc\")"
[2] "T:list(d = 1, e = 2)"
短向量重復(fù)使用,列表數(shù)據(jù)只有一級列表能有好的表現(xiàn),能不能用看自己需要。會得到什么樣的結(jié)果是可以預(yù)知的,用as.character函數(shù)看吧,這又是一個字符串處理函數(shù):
> as.character(x)
[1] "aaa" "bbb" "ccc"
> as.character(z)
[1] "list(a = \"aaa\", b = \"bbb\", c = \"ccc\")"
[2] "list(d = 1, e = 2)"
paste函數(shù)還有一個用法,設(shè)置collapse參數(shù),連成一個字符串:
> paste(x, y, sep="-", collapse='; ')
[1] "aaa-1; bbb-2; ccc-1"
> paste(x, collapse='; ')
[1] "aaa; bbb; ccc"
————————————————————————————————————————————————————————
三、字符串拆分
strsplit函數(shù)使用正則表達(dá)式,使用格式為:strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)
參數(shù)x為字串向量,每個元素都將單獨(dú)進(jìn)行拆分。
參數(shù)split為拆分位置的字串向量,默認(rèn)為正則表達(dá)式匹配(fixed=FALSE)。如果你沒接觸過正則表達(dá)式,設(shè)置fixed=TRUE,表示使用普通文本匹配或正則表達(dá)式的精確匹配。普通文本的運(yùn)算速度快。
perl=TRUE/FALSE的設(shè)置和perl語言版本有關(guān),如果正則表達(dá)式很長,正確設(shè)置表達(dá)式并且使用perl=TRUE可以提高運(yùn)算速度。
參數(shù)useBytes設(shè)置是否逐個字節(jié)進(jìn)行匹配,默認(rèn)為FALSE,即按字符而不是字節(jié)進(jìn)行匹配。
下面的例子把一句話按空格拆分為單詞:
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> text <- "Hello Adam!\nHello Ava!"
> strsplit(text, ' ')
[[1]]
[1] "Hello" "Adam!\nHello" "Ava!"
R語言的字符串事實(shí)上也是正則表達(dá)式,上面文本中的\n在圖形輸出中是被解釋為換行符的。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> strsplit(text, '\\s')
[[1]]
[1] "Hello" "Adam!" "Hello" "Ava!"
strsplit得到的結(jié)果是列表,后面要怎么處理就得看情況而定了:
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> class(strsplit(text, '\\s'))
[1] "list"
有一種情況很特殊:如果split參數(shù)的字符長度為0,得到的結(jié)果就是一個個的字符:
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> strsplit(text, '')
[[1]]
[1] "H" "e" "l" "l" "o" " " "A" "d" "a" "m" "!" "\n" "H" "e" "l" "l"
[17] "o" " " "A" "v" "a" "!"
從這里也可以看到R把 \n 是當(dāng)成一個字符來處理的。
————————————————————————————————————————————————————————
四、字符串查詢:
1、grep和grepl函數(shù):
這兩個函數(shù)返回向量水平的匹配結(jié)果,不涉及匹配字符串的詳細(xì)位置信息。
grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,
fixed = FALSE, useBytes = FALSE, invert = FALSE)
grepl(pattern, x, ignore.case = FALSE, perl = FALSE,
fixed = FALSE, useBytes = FALSE)
雖然參數(shù)看起差不多,但是返回的結(jié)果不一樣。下來例子列出C:\windows目錄下的所有文件,然后用grep和grepl查找exe文件:
> files <- list.files("c:/windows")
> grep("\\.exe$", files)
[1] 8 28 30 35 36 57 68 98 99 101 110 111 114 116
> grepl("\\.exe$", files)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[14] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#......
grep僅返回匹配項(xiàng)的下標(biāo),而grepl返回所有的查詢結(jié)果,并用邏輯向量表示有沒有找到匹配。兩者的結(jié)果用于提取數(shù)據(jù)子集的結(jié)果都一樣:
> files[grep("\\.exe$", files)]
[1] "bfsvc.exe" "explorer.exe" "fveupdate.exe" "HelpPane.exe"
[5] "hh.exe" "notepad.exe" "regedit.exe" "twunk_16.exe"
[9] "twunk_32.exe" "uninst.exe" "winhelp.exe" "winhlp32.exe"
[13] "write.exe" "xinstaller.exe"
> files[grepl("\\.exe$", files)]
[1] "bfsvc.exe" "explorer.exe" "fveupdate.exe" "HelpPane.exe"
[5] "hh.exe" "notepad.exe" "regedit.exe" "twunk_16.exe"
[9] "twunk_32.exe" "uninst.exe" "winhelp.exe" "winhlp32.exe"
[13] "write.exe" "xinstaller.exe"
2、regexpr、gregexpr和regexec
這三個函數(shù)返回的結(jié)果包含了匹配的具體位置和字符串長度信息,可以用于字符串的提取操作。
> text <- c("Hellow, Adam!", "Hi, Adam!", "How are you, Adam.")
> regexpr("Adam", text)
[1] 9 5 14
attr(,"match.length")
[1] 4 4 4
attr(,"useBytes")
[1] TRUE
> gregexpr("Adam", text)
[[1]]
[1] 9
attr(,"match.length")
[1] 4
attr(,"useBytes")
[1] TRUE
[[2]]
[1] 5
attr(,"match.length")
[1] 4
attr(,"useBytes")
[1] TRUE
[[3]]
[1] 14
attr(,"match.length")
[1] 4
attr(,"useBytes")
[1] TRUE
> regexec("Adam", text)
[[1]]
[1] 9
attr(,"match.length")
[1] 4
[[2]]
[1] 5
attr(,"match.length")
[1] 4
[[3]]
[1] 14
attr(,"match.length")
[1] 4
五、字符串替換
雖然sub和gsub是用于字符串替換的函數(shù),但嚴(yán)格地說R語言沒有字符串替換的函數(shù),因?yàn)?a href='/map/r/' style='color:#000;font-size:inherit;'>R語言不管什么操作對參數(shù)都是傳值不傳址。
> text
[1] "Hello Adam!\nHello Ava!"
> sub(pattern="Adam", replacement="world", text)
[1] "Hello world!\nHello Ava!"
> text
[1] "Hello Adam!\nHello Ava!"
可以看到:雖然說是“替換”,但原字符串并沒有改變,要改變原變量我們只能通過再賦值的方式。
sub和gsub的區(qū)別是前者只做一次替換(不管有幾次匹配),而gsub把滿足條件的匹配都做替換:
> sub(pattern="Adam|Ava", replacement="world", text)
[1] "Hello world!\nHello Ava!"
> gsub(pattern="Adam|Ava", replacement="world", text)
[1] "Hello world!\nHello world!"
sub和gsub函數(shù)可以使用提取表達(dá)式(轉(zhuǎn)義字符+數(shù)字)讓部分變成全部:
> sub(pattern=".*(Adam).*", replacement="\\1", text)
[1] "Adam"
六、字符串提取
substr和substring函數(shù)通過位置進(jìn)行字符串拆分或提取,它們本身并不使用正則表達(dá)式,但是結(jié)合正則表達(dá)式函數(shù)regexpr、gregexpr或regexec使用可以非常方便地從大量文本中提取所需信息。兩者的參數(shù)設(shè)置基本相同:
substr(x, start, stop)
substring(text, first, last = 1000000L)
第 1個參數(shù)均為要拆分的字串向量,第2個參數(shù)為截取的起始位置向量,第3個參數(shù)為截取字串的終止位置向量。但它們的返回值的長度(個數(shù))有差 別:substr返回的字串個數(shù)等于第一個參數(shù)的長度;而substring返回字串個數(shù)等于三個參數(shù)中最長向量長度,短向量循環(huán)使用。先看第1參數(shù)(要 拆分的字符向量)長度為1例子:
> x <- "123456789"
> substr(x, c(2,4), c(4,5,8))
[1] "234"
> substring(x, c(2,4), c(4,5,8))
[1] "234" "45" "2345678"
因?yàn)閤的向量長度為1,所以substr獲得的結(jié)果只有1個字串,即第2和第3個參數(shù)向量只用了第一個組合:起始位置2,終止位置4。
而substring的語句三個參數(shù)中最長的向量為c(4,5,8),執(zhí)行時按短向量循環(huán)使用的規(guī)則第一個參數(shù)事實(shí)上就是c(x,x,x),第二個參數(shù)就成了c(2,4,2),最終截取的字串起始位置組合為:2-4, 4-5和2-8。
請按照這樣的處理規(guī)則解釋下面語句運(yùn)行的結(jié)果:
> x <- c("123456789", "abcdefghijklmnopq")
> substr(x, c(2,4), c(4,5,8))
[1] "234" "de"
> substring(x, c(2,4), c(4,5,8))
[1] "234" "de" "2345678"
用substring函數(shù)可以很方便地把DNA/RNA序列進(jìn)行三聯(lián)拆分(用于蛋白質(zhì)翻譯):
> bases <- c('A','T','G','C')
> DNA <- paste(sample(bases, 12, replace=T), collapse='')
> DNA
[1] "CCTTTACGGTGT"
> substring(DNA, seq(1,10,by=3), seq(3,12,by=3))
[1] "CCT" "TTA" "CGG" "TGT"
用regexpr、gregexpr或regexec函數(shù)獲得位置信息后再進(jìn)行字符串提取的操作可以自己試試看。
七、其他:
比如strtrim、strwrap、charmatch、match和pmatch等,甚至是 %in% 運(yùn)算符都是可以使用的。R的在線幫助很全,自己看吧,就當(dāng)學(xué)習(xí)E文。
————————————————————————————————————————————————————————
字符串替換函數(shù):chartr( )
chartr( )函數(shù):將原有字符串中特定字符替換成所需要的字符。
其中參數(shù)old 表示原有字符串中內(nèi)容;new 表示替換后的字符內(nèi)容。
大小寫替換函數(shù):toupper( )、tolower( )、casefold( )
toupper( )函數(shù):將字符串統(tǒng)一轉(zhuǎn)換為大寫。
tolower( )函數(shù):將字符串統(tǒng)一轉(zhuǎn)換為小寫。
casefold( )函數(shù):根據(jù)參數(shù)轉(zhuǎn)換大小寫。
來自:每R一點(diǎn):R語言中的字符串處理函數(shù)
strtrim函數(shù)
用于將字符串修剪到特定的顯示寬度,其用法為strtrim(x, width),返回字符串向量的長度等于x的長度。因?yàn)槭恰靶藜簟?,所以只能去掉多余的字符不能增加其他額外的字符:如果字符串本身的長度小于 width,得到的是原字符串,別指望它會用空格或其他什么字符補(bǔ)齊:
strtrim(c("abcdef", "abcdef", "abcdef"), c(1, 5, 10))
## [1] "a" "abcde" "abcdef"
strtrim(c(1, 123, 1234567), 4)
## [1] "1" "123" "1234"
strwrap函數(shù)
該函數(shù)把一個字符串當(dāng)成一個段落的文字(不管字符串中是否有換行符),按照段落的格式(縮進(jìn)和長度)和斷字方式進(jìn)行分行,每一行是結(jié)果中的一個字符串。例如:數(shù)據(jù)分析師培訓(xùn)
str1 <- "Each character string in the input is first split into paragraphs\n(or lines containing whitespace only). The paragraphs are then\nformatted by breaking lines at word boundaries. The target\ncolumns for wrapping lines and the indentation of the first and\nall subsequent lines of a paragraph can be controlled\nindependently."str2 <- rep(str1, 2) strwrap(str2, width = 80, indent = 2)
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10