本文来源于陈兴栋、张铁军、刘振球老师编写的《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链接
生信工程师入门最佳指南
学徒培养