首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

R语言字符串处理值stringr

用R语言处理字符串,相比于perl和python来说,比较麻烦。不能用下标提取,也不能用循环遍历索引。而R自身的字符串处理函数,如sub()、grep()等函数又增加的记忆负担。随着使用R语言的场景越来越多,字符串处理是必不可少的。给大家推荐一个由Hadley Wickham开发的一个灵活的字符串处理包stringr。

stringr的安装和其他安装包一样,进入到R的命令界面,运行以下命令并加载:

install.packages('stringr')

library(stringr)

stringr处理字符串是以正则表达式为基础的,所以在学习和使用stringr的时候最好能对正则表达式有一定的了解。

1)字符串的长度

#字符串长度,类似R基础函数的nchar

str_length(c("a","R for datascience",NA))

#> [1] 1 18 NA

#

# fruit

str_count(fruit,"a") #返回向量fruit中可以匹配字母a的个数

#> [1] 1 3 1 1

2)字符串拼接函数:

str_c()把多个字符串拼接起来,类似str_join和R基础函数paste

str_c("x","y")

#> [1] "xy"

str_c("x","y","z")

#> [1] "xyz"

使用sep参数,设定分隔符:

str_c("x","y",sep =",")

#> [1] "x, y"

和其他R函数一样,缺失值会忽略.如果你想输出确实值为"NA",需要用到str_replace_na()函数:

x c("abc",NA)

str_c("|-", x,"-|")

#> [1] "|-abc-|" NA

str_c("|-",str_replace_na(x),"-|")

#> [1] "|-abc-|""|-NA-|"

上面的事例可以看出,str_c()是向量化处理的,自动循环向量,输出同样长度的向量:

str_c("prefix-",c("a","b","c"),"-suffix")

#> [1] "prefix-a-suffix""prefix-b-suffix" "prefix-c-suffix"

如果结合if语句,会选择性的输出想要的结果,如下:

name

time_of_day

birthday

str_c(

"Good ",time_of_day," ", name,

if(birthday)" and HAPPY BIRTHDAY",

"."

)

#> [1] "Good morning Hadley."

如果需要把向量也链接起来,需要使用参数collapse:

str_c(c("x","y","z"),collapse =", ")

#> [1] "x, y, z"

3)字符串提取:

字符串提取函数是str_sub,有两个参数start和end

str_sub(string, start, end)

c"Apple""Banana""Pear"

str_sub13

#> [1] "App" "Ban" "Pea"

# negative numbers count backwards from end

str_sub31

#> [1] "ple" "ana" "ear"

需要注意的是,如果字符串太短,是str_sub并不会报错,会尽可能的返回匹配的结果:

str_sub"a"15

#> [1] "a"

你也可以是去进行替换和修改匹配的字符串:

c"Apple""Banana""Pear"

str_sub11str_to_lowerstr_sub11

#> [1] "apple" "banana" "pear"

4)大小写转换:

#参数locale用于设定转换的语言,默认是英语

#转换成大写

str_to_upperc"i""h"

#> [1] "I" "H"

#转换成小写

str_to_lowerc"I""H"locale = “en

#> [1] "i" "h"

#首字母转换成大写

c"apple""banana""pear"

str_to_title()

#> [1]"Apple""Banana""Pear"

5)字符串排序:

c"apple""eggplant""banana"

str_sortlocale ="en"# English

#> [1] "apple" "banana" "eggplant"

str_order#返回索引

#> [1] 1 3 2

x[str_order]#结果和str_sort一样

#> [1] "apple" "banana" "eggplant"

6)检查字符串是否匹配:

检查字符串是否匹配成功,并返回逻辑值

x c("apple","banana","pear")

str_detect(x,"e")

#> [1] TRUE FALSE TRUE

#结合sum函数可以统计有多少个匹配成功

sum(str_detect(x,"e"))

#使用!符合可以得到相反的结果

!str_detect(x,"e")

#> [1] FALSE TRUE FALSE

#可以使用正在匹配的模式

x[str_detect(x,"e")]

#> [1] "apple" "pear"

x[str_detect(x,"e$")]#美元符号$,在正则表达式里面表示末尾匹配

#> [1] "pear"

7)替换

str_replace(string, pattern,replacement)

str_replace_all(string, pattern,replacement)

以上两个函数用于替换匹配成功的字符,区别是str_replace指替换第一个匹配成功的字符,str_replace_all替换全部匹配成功的字符:

x c("apple","pear","banana")

str_replace(x,"a","-")#只替换a为-,而且只替换一次

#> [1] "-pple" "pe-r" "b-nana"

str_replace_all(x,"a","-")#替换全部a为-

#> [1] "-pple" "pe-r" "b-n-n-"

str_replace(x,"[aeiou]","-")#[aeiou]表示替换中括号中其中之一

#> [1] "-pple" "p-ar" "b-nana"

str_replace_all(x,"[aeiou]","-")#[aeiou]表示替换中括号中所有

#> [1] "-ppl-""p--r" "b-n-n-"

#其中str_repalce_all,可以写成以下字典的模式:

x c("1house","2cars","3people")

str_replace_all(x,c("1"="one","2"="two","3"="three"))

#> [1] "one house" "two cars" "three people"

8)返回匹配的字符串

str_subset(string, pattern)

val

#全文匹配

str_subset(val,"a")

[1] "abc" "cba"

#开头匹配

str_subset(val,"^a")

[1] "abc"

#结尾匹配

str_subset(val,"a$")

[1] "cba"

9)字符串分割

"This is a sentence. This is another sentence."

#以空格分割字符串,返回的是一个list

str_split" ",

[[1]]

[1] "This" "is" "a" "sentence.""""This" "is"

[8] "another" "sentence."

#以空格分割字符串,返回的是一个list,可以用下标提取,使其成为一个向量

str_split" "1

#> [1] "This" "is" "a" "sentence." "" "This"

#> [7] "is" "another" "sentence."

#使用boundary("word")这种方式,是以word的边界为分割,可以提出标点符号以及多余的空格,如下:

str_splitboundary"word"1

#> [1] "This" "is" "a" "sentence" "This" "is"

#> [7] "another" "sentence"

其他方法不常用,

str_trim():去掉字符串的空格和TAB(\t)

str_pad():补充字符串的长度

str_dup():复制字符串

str_wrap():控制字符串输出格式

str_locate:找到匹配的字符串的位置。

str_conv:字符编码转换

/End.

扫描左侧二维码,添加生信者言小助手Anymore的微信号,即可加入生信者言交流群,生信大咖、测序同行、作者团队,等你来撩!

欢迎关注生信者言微信公众号。我们在喜马拉雅FM、千聊直播平台也开设了干货课程,请在相关平台搜索并订阅 “生信者言”,精彩内容袭来。

回复文字:果然科学,看一篇好玩的科普文。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180310G016MN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券