Python與R的異同(二):字符串操作

字符串操作的差異

R本身設(shè)計初衷主要是用來處理矩陣運算這類數(shù)學問題,因此在字符串操作方面比較薄弱。Python并不是專門用來進行數(shù)學計算的,沒有偏向性,字符串操作優(yōu)良。但是多年前聽說還是比不上Perl,不知道現(xiàn)在怎么樣了。

構(gòu)建字符串

R的字符串無論數(shù)量多少都是存放在向量數(shù)據(jù)結(jié)構(gòu)中,復雜一點的存放就是array, matrix, data.frame, list;Python有專門的字符串類型數(shù)據(jù)結(jié)構(gòu),如果需要存放多個字符串,則可以用序列類型,如list(列表), dict(字典), tuple(元組),set(集合)。

下面是手動創(chuàng)建字符串的一些操作,基本上R就比Python少了一個'''操作而已,這個在Python里是用于賦值多行字符串的。R連多行注釋都沒有,這個也能理解吧

# 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定義一個文件對象,由于文件對象是可迭代的,所以最后可以保存成序列類型的數(shù)據(jù)結(jié)構(gòu),如列表

[line for line open('file.txt', 'r')]
with open('file.txt', 'r') as f:
    strings = f.readlines()

R原本是用來進行數(shù)據(jù)分析的,所以用的是read.table類函數(shù)讀取多列存放的數(shù)據(jù),成為后續(xù)操作會用到的data.frame對象。當然對于普通的文本文件,與Python的open和readlines對應(yīng)的是filereadLines,注意這里的Lines,打錯就是其他函數(shù)了。

# 類似open
fileA <- file("text.txt", "r")
# 類似python的readline和readlines
# 可以指定固定行, readline(fileA, n=1), 默認全部讀取
text <- readLines(fileA)
length(text)

這里的text的每一個元素對應(yīng)為text.txt的行數(shù)據(jù)。
可以練習一下讀取fasta文件,并保存為R的list格式。

函數(shù)

R語言本身的目的不是做文本處理的,基礎(chǔ)功能比較薄弱是可以理解的?;A(chǔ)函數(shù)大致是如下幾個:
nchar(): 函數(shù)返回字符串長度
paste(), paste0(): 連接若干個字符串
sprintf():格式化輸出
toupper(): 大寫轉(zhuǎn)換
tolower(): 小寫轉(zhuǎn)換
substr(): 提取或替換一個字符串向量的子串
正則表達式相關(guān)的函數(shù),如grep, grepl, regexpr, gregexpr, sub, gsub, strsplit.

后來Hadley大神看不下去,寫了一個stringr用來強化R語言字符串操作,效果拔群。
stringr函數(shù)主要分為四類:

  1. 字符操作:操作字符向量中的單個字符 str_length, str_sub, str_dup
  2. 添加,移除和操作空白符 str_pad, str_trim, str_wrap
  3. 大小寫轉(zhuǎn)換處理 str_to_lower, str_to_upper, str_to_title
  4. 模式匹配函數(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中字符串數(shù)據(jù)結(jié)構(gòu)本身就有許多的方法,而且還有一些包提供其他功能,比如說re提供了正則表達式功能,string擴展了更多功能。
用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']

對于一個的字符單位的操作而言,R和Python基本上都有一一對應(yīng)的函數(shù),比如說R的str_to lower(), str_to_upper(), str_to_title()對應(yīng)就是python的lower(), upper(), title(),R的模式匹配函數(shù)對應(yīng)的是Python的re模塊。
然對于多個字符串組成的整體而言,需要記住R是向量化操作,相對應(yīng)的是Python必須要用列表推導式,舉個例子就是

# R
library(stringr)
ss <- c('abc', 'efg')
str_to_upper(ss)
# Python
ss = ['abc', 'efg']
[string.upper() for string in ss]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在挖掘分析的過程當中對字符串的處理是極為重要的,且出現(xiàn)也較為頻繁,R語言作為當前最為流行的開源數(shù)據(jù)分析和可視化平臺...
    果果哥哥BBQ閱讀 6,151評論 0 8
  • R語言主要擅長于數(shù)值向量和矩陣操作,但是讓他去做字符串操作也可以。 字符串的基本操作類型: 查找和替換 大小寫轉(zhuǎn)換...
    xuzhougeng閱讀 6,152評論 1 7
  • 外面的雨淅淅瀝瀝,不適合出門,最適合遐思和想念。媽媽才打個電話說衡陽大雨傾盆,并問我昨天去博物館好不好玩。我才忘記...
    嬛姝閱讀 419評論 0 1
  • ????每次修改系統(tǒng)環(huán)境變量以后需要重啟explorer.exe進程,使之生效,但是在安裝python的時候,發(fā)現(xiàn)...
    laravel閱讀 877評論 0 0
  • 一、 下面的代碼輸出多少?修改代碼讓fnArri 輸出 i。使用兩種以上的方法 方法1 方法2 方法3 二、 封裝...
    崔敏嫣閱讀 329評論 0 0

友情鏈接更多精彩內(nèi)容