R之字符串操作

本文来源于陈兴栋、张铁军、刘振球老师编写的《R语言与数据清洗》第11章字符串的操作学习笔记。

1. 字符串的长度

length():统计字符串的长度,一个引号之内属于一个字符串;
nchar():统计字符串之内的字符数

x <- "R"
y <- "I love R"
length(x)
## [1] 1
length(y)
## [1] 1
my_string <- "I love China"
nchar(my_string)
##[1] 12

注意:一个向量之中,只要包含一个字符串,即使其余元素不是字符串,也会转变为字符串。而字符串又往往成为因子变量。可以通过以下修改:options(stringsAsFactors = FALSE) #禁止chr转成factor

2. 字符串的粘贴与拆分

paste():参数:sep默认为空格,可以自己调整;
参数:collapse, 用来将所有返回的结果合并成一个完整而独立的字符串。默认取值NULL,即不进行合并。、
paste0():无缝粘贴。
strsplit():字符串的分割函数,可以指定分割符,生成一个list

 a <- letters[1:4]
 b <- 1:4
paste(a,b,sep = "-",collapse = ";")
## [1] "a-1;b-2;c-3;d-4"
a <- "I love"
 b <- "China"
 paste0(a,b)
## "I loveChina"
my_string2 <- "I love China"
 strsplit(my_string2,split = " ")
## [[1]]
## [1] "I"     "love"  "China"

 my_string3 <- "R is a program;R is proficient at data science;R is excellent in data visualization"
 strsplit(my_string3,split = ";")
## [[1]]
## [1] "R is a program"                       "R is proficient at data science"      "R is excellent in data visualization"

 x <- "AppleBoyCatDogEggZoo"
 strsplit(x,split = '[A-Z]')
## [[1]]
## [1] ""     "pple" "oy"   "at"   "og"   "gg"   "oo"  

 y <- "Apple!Boy#Cat@Dog%Egg&Zoo"
 strsplit(y,split = "\\W")

## [[1]]
## [1] "Apple" "Boy"   "Cat"   "Dog"   "Egg"   "Zoo"  

3. 字符串提取

substr():参数start, stop
substring()参数first, last
另外,这两个函数还有赋值替换功能。

substr("abcdef",start = 1, stop = 3)
substring("abcdef",first = 1, last = 3)

x <- c("Barcelona","Real Madrid","Arsenal","Chelsea")
substr(x,1,3:6)

substr(x,1,3) <- "+++"
#x的第一位到第三位字符被替换为“+++”;

substr(x,1,1) <- "<<<"
#虽然“<<<”有三个字符,但是由于我们指定的替换位置只有一个字符长度,因此,仅有第一个字符被替换成“<”

4. gsub和sub

字符串替换
gsub替换匹配到的全部
sub 替换匹配到的第一个

# 将b替换为B
gsub(pattern = "b", replacement = "B", x = "baby")
[1] "BaBy"

gsub(pattern = "b", replacement = "B", x = c("abcb", "boy", "baby"))
[1] "aBcB" "Boy"  "BaBy"

# 只替换第一个b
sub(pattern = "b", replacement = "B", x = "baby")
[1] "Baby"

sub(pattern = "b", replacement = "B", x = c("abcb", "baby"))
[1] "aBcb" "Baby"

5.grep和grepl

字符串匹配
grep函数返回的是索引值
grepl函数返回的是逻辑值

seq_names <- c('EU_FRA02_C1_S2008','AF_COM12_B0_2004','AF_COM17_F0_S2008','AS_CHN11_C3_2004',
               'EU-FRA-C3-S2007','NAUSA02E02005', 'AS_CHN12_N0_05','NA_USA03_C2_S2007','NA USA04 A3 2004',
               'EU_UK01_A0_2009','eu_fra_a2_s98', 'SA/BRA08/B0/1996')

fra_seq <- grep(pattern = 'FRA|fra', x = seq_names)
fra_seq
seq_names[fra_seq]

grep(pattern = 'FRA|fra', x = seq_names, value = TRUE)

grepl(pattern = 'FRA|fra', x = seq_names)

seq_names[grepl(pattern = 'FRA|fra', x = seq_names)]

spe_seq <- seq_names[which(! grepl('[s|S][0-9]{2,4}\\b', seq_names))]
#[]表示具体的匹配对象
#{}表示前面的表达式重复的次数
#\\b,b是“boundary"的缩写,限制字符的边界,\\b放在开头,则正则表达式应用于开头;\\b放在末尾,则正则表达式应用于末尾
spe_seq

a_seq <- grep('[a|A][0-9]{1}', seq_names, value = TRUE)
a_seq

a_seq02 <- grep('^[A-Za-z]{2}.[A-Za-z]{2,3}.[0-9]{0,2}.[aA]',seq_names,value = TRUE)
a_seq02

6. regexpr()函数

匹配的具体位置和字符串长度

test_string <- c('happy', 'apple','application','apolitic','noppppy')
regexpr('pp',test_string)
## [1]  3  2  2 -1  3
attr(,"match.length")
## [1]  2  2  2 -1  2
attr(,"index.type")
### [1] "chars"
attr(,"useBytes")
### [1] TRUE

7. gregexpr和regexex函数

gregexpr(pattern,text)函数可以在字符串x中提取出特定字符串pattern的相关信息,返回第一次的匹配结果(原文),但是根据下面的结果来说不是这样的,原因以后探索。
regexex(pattern,text)函数可以在字符串x中提取出特定字符串pattern的相关信息,返回所有匹配到的结果
两者都是以列表的形式返回结果。

test_string <- c('happy', 'apple','application','apolitic','noppppy') 
gregexpr('pp',test_string)
[[1]]
[1] 3
attr(,"match.length")
[1] 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[2]]
[1] 2
attr(,"match.length")
[1] 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[3]]
[1] 2
attr(,"match.length")
[1] 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[4]]
[1] -1
attr(,"match.length")
[1] -1
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[5]]
[1] 3 5
attr(,"match.length")
[1] 2 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

> regexec('pp',test_string)
[[1]]
[1] 3
attr(,"match.length")
[1] 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[2]]
[1] 2
attr(,"match.length")
[1] 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[3]]
[1] 2
attr(,"match.length")
[1] 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[4]]
[1] -1
attr(,"match.length")
[1] -1
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

[[5]]
[1] 3
attr(,"match.length")
[1] 2
attr(,"index.type")
[1] "chars"
attr(,"useBytes")
[1] TRUE

8. agrep()函数

允许通假字的存在,这个比喻形象。

test_string4 <- c('I need a favor', 'my favouriate book','you made a favouur')
agrep('favor',test_string4, max.distance = 1) #max.distance 改变最大匹配距离
##[1] 1 2 3

9. 大小写替换函数:toupper()、tolower()、casefold()

toupper()函数:将字符串统一转换为大写。
tolower()函数:将字符串统一转换为小写。
casefold()函数:根据参数转换大小写。
chartr (old,new,x),chartr-将对象中旧的字符用新的字符替代。其中参数old 表示原有字符串中内容;new 表示替换后的字符内容。
  tolower(x)
  toupper(x)
  casefold(x, upper = FALSE)
  chartr(old, new, x)

### 这两个函数就不用多介绍了,按字面意思就是把对象转换成大写或小写,应用于全部的对象,例如:
toupper("abc")
##[1]"ABC"
tolower("ABC")
##[1]"abc"
x<-c("My","First","Trip")
tolower(x)
## [1] "my" "first" "trip"

casefold('ABDATA', upper = FALSE)
##[1] "abdata"
casefold('baorui', upper = FALSE)
## [1] "baorui"
casefold('baorui', upper = TRUE)
## [1] "BAORUI"
# 这里这只提供全部应用的大小写转换,部分转换可以参照函数chartr()。
chartr(old, new, x)

10. match 匹配元素位置组成的向量

match按向量进行运算,返回第一次匹配的元素的位置(如果有),非字符向量也可用。

match("xx", c("abc", "xx", "xxx", "xx"))
## [1] 2

参考:陈兴栋、张铁军、刘振球老师《R语言与数据清洗》

生信技能树公益视频合辑:学习顺序是linux,r,软件安装,geo,小技巧,ngs组学!
B站链接
YouTube链接
生信工程师入门最佳指南
学徒培养

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,124评论 0 21
  • R语言主要擅长于数值向量和矩阵操作,但是让他去做字符串操作也可以。 字符串的基本操作类型: 查找和替换 大小写转换...
    xuzhougeng阅读 5,925评论 1 7
  • 20171205(从有道迁移) 高级数据管理 示例问题:给所有学生确定一个单一的成绩衡量指标,需要将这些科目的成绩...
    KrisKC阅读 452评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,233评论 0 4