字符串操作的差異
R本身設(shè)計(jì)初衷主要是用來(lái)處理矩陣運(yùn)算這類數(shù)學(xué)問(wèn)題,因此在字符串操作方面比較薄弱进鸠。Python并不是專門用來(lái)進(jìn)行數(shù)學(xué)計(jì)算的形病,沒(méi)有偏向性,字符串操作優(yōu)良量瓜。但是多年前聽(tīng)說(shuō)還是比不上Perl途乃,不知道現(xiàn)在怎么樣了耍共。
構(gòu)建字符串
R的字符串無(wú)論數(shù)量多少都是存放在向量數(shù)據(jù)結(jié)構(gòu)中,復(fù)雜一點(diǎn)的存放就是array, matrix, data.frame, list杠纵;Python有專門的字符串類型數(shù)據(jù)結(jié)構(gòu)钩骇,如果需要存放多個(gè)字符串倘屹,則可以用序列類型,如list(列表), dict(字典), tuple(元組)唐瀑,set(集合)哄辣。
下面是手動(dòng)創(chuàng)建字符串的一些操作,基本上R就比Python少了一個(gè)'''
操作而已毅弧,這個(gè)在Python里是用于賦值多行字符串的当窗。R連多行注釋都沒(méi)有,這個(gè)也能理解吧
# R
s <- 'abc' 元咙; s <- "abc"; s<- "s'b" ; s <- 's\'b'
ss <- c('abc','efg')
ss_matrix <- matrix(c('ab','bc','cd','de'),nrow=2)
ss_list <- list('a','b','c','d')
# Python
ss = 'abc' ; ss = "abc" ; ss = "What's your name"; ss = 'What\'s your name' ; ss ='''What's your name庶香; "sb?" '''
ss_list = ['abc','edf']
ss_dict= {'a':'b', 'c':'d'}
ss_tuple = ('a','b')
如果是從文本里面讀取數(shù)據(jù)的話,Python是先用open定義一個(gè)文件對(duì)象,由于文件對(duì)象是可迭代的感猛,所以最后可以保存成序列類型的數(shù)據(jù)結(jié)構(gòu)奢赂,如列表
[line for line open('file.txt', 'r')]
with open('file.txt', 'r') as f:
strings = f.readlines()
R原本是用來(lái)進(jìn)行數(shù)據(jù)分析的膳灶,所以用的是read.table
類函數(shù)讀取多列存放的數(shù)據(jù),成為后續(xù)操作會(huì)用到的data.frame對(duì)象司致。當(dāng)然對(duì)于普通的文本文件聋迎,與Python的open和readlines對(duì)應(yīng)的是file
和readLines
霉晕,注意這里的Lines,打錯(cuò)就是其他函數(shù)了拄轻。
# 類似open
fileA <- file("text.txt", "r")
# 類似python的readline和readlines
# 可以指定固定行, readline(fileA, n=1), 默認(rèn)全部讀取
text <- readLines(fileA)
length(text)
這里的text的每一個(gè)元素對(duì)應(yīng)為text.txt的行數(shù)據(jù)伟葫。
可以練習(xí)一下讀取fasta文件,并保存為R的list格式斧抱。
函數(shù)
R語(yǔ)言本身的目的不是做文本處理的渐溶,基礎(chǔ)功能比較薄弱是可以理解的茎辐〉嗨。基礎(chǔ)函數(shù)大致是如下幾個(gè):
nchar()
: 函數(shù)返回字符串長(zhǎng)度
paste()
, paste0()
: 連接若干個(gè)字符串
sprintf()
:格式化輸出
toupper()
: 大寫轉(zhuǎn)換
tolower()
: 小寫轉(zhuǎn)換
substr()
: 提取或替換一個(gè)字符串向量的子串
正則表達(dá)式相關(guān)的函數(shù)懊亡,如grep, grepl, regexpr, gregexpr, sub, gsub, strsplit.
后來(lái)Hadley大神看不下去丐黄,寫了一個(gè)stringr
用來(lái)強(qiáng)化R語(yǔ)言字符串操作孔飒,效果拔群坏瞄。
stringr函數(shù)主要分為四類:
- 字符操作:操作字符向量中的單個(gè)字符 str_length, str_sub, str_dup
- 添加桂对,移除和操作空白符 str_pad, str_trim, str_wrap
- 大小寫轉(zhuǎn)換處理 str_to_lower, str_to_upper, str_to_title
- 模式匹配函數(shù) str_detect, str_subset, str_count, str_locate, str_locate_all, str_match, str_match_all, str_replace, str_replace_all, str_split_fix, str_split, str_extract, str_extract_all
Python中字符串?dāng)?shù)據(jù)結(jié)構(gòu)本身就有許多的方法,而且還有一些包提供其他功能鸠匀,比如說(shuō)re
提供了正則表達(dá)式功能蕉斜,string
擴(kuò)展了更多功能。
用dir看下有哪些字符串類型函數(shù)
dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
對(duì)于一個(gè)的字符單位的操作而言缀棍,R和Python基本上都有一一對(duì)應(yīng)的函數(shù)宅此,比如說(shuō)R的str_to lower(), str_to_upper(), str_to_title()
對(duì)應(yīng)就是python的lower(), upper(), title()
,R的模式匹配函數(shù)對(duì)應(yīng)的是Python的re
模塊。
然對(duì)于多個(gè)字符串組成的整體而言爬范,需要記住R是向量化操作父腕,相對(duì)應(yīng)的是Python必須要用列表推導(dǎo)式,舉個(gè)例子就是
# R
library(stringr)
ss <- c('abc', 'efg')
str_to_upper(ss)
# Python
ss = ['abc', 'efg']
[string.upper() for string in ss]