R语言stringr包处理字符串

stringr包是R数据处理神器Tidyverse包中的工具之一,是处理字符串很好用的工具,结合正则表达式,可以发挥巨大作用。

字符串长度

stringr包的操作对象是向量str_length()函数用于确定字符串长度。

> x <- c("why", "video", "cross", "extra", "deal", "authority")
> str_length(x)
#> [1] 3 5 5 5 4 9

但是如果是下面这种写法,便会出现语法错误,因为输入对象是非向量。

> str_length("why", "video", "cross", "extra", "deal", "authority")
Error in str_length("why", "video", "cross", "extra", "deal", "authority") : 
  unused arguments ("video", "cross", "extra", "deal", "authority")

字符串拼接

str_c()函数用于进行字符串的拼接,主要参数有待拼接字符串向量sep=''collapse=NULL

> x = c('apple', 'banana','peach')
> y = c('one', 'two', 'three')
> str_c(x, y)
# [1] "appleone"   "bananatwo"  "peachthree"
> str_c(x, y, sep = '_')
# [1] "apple_one"   "banana_two"  "peach_three"
> str_c(x, y, collapse = "_")
# [1] "appleone_bananatwo_peachthree"

注意,上述例子中sepcollapse的作用后的不同,sep作用后还是多个字符串collapse作用后则变为了一个字符串。

> case1 <- str_c(x, y, sep = '_')
> str_length(case1)
# [1]  9 10 11
> case2 <- str_c(x, y, collapse = "_")
> str_length(case2)
# [1] 29

字符串拆分

str_split()stringr包中进行字符串拆分的函数,根据特定字符或者子集数量进行字符串拆分,选取特定子集。

# 构建一个由'_'分割的字符串向量
> x <- c('aajs_123_dkks', 'ahda_236_akdk', 'ahdj_178_ajdj', 'agsh_109_auqyr', 'qwp_2635_qnjx')
> str_split(x, pattern = '_')
[[1]]
[1] "aajs" "123"  "dkks"

[[2]]
[1] "ahda" "236"  "akdk"

[[3]]
[1] "ahdj" "178"  "ajdj"

[[4]]
[1] "agsh"  "109"   "auqyr"

[[5]]
[1] "qwp"  "2635" "qnjx"

主要参数如下pattern = , n = Inf , simplify = FALSE,默认返回值类型为listsimplify = True则返回值类型为matrix,array

> class(str_split(x, pattern = '_'))
[1] "list"
> str_split(x, pattern = '_', simplify = TRUE)
     [,1]   [,2]   [,3]   
[1,] "aajs" "123"  "dkks" 
[2,] "ahda" "236"  "akdk" 
[3,] "ahdj" "178"  "ajdj" 
[4,] "agsh" "109"  "auqyr"
[5,] "qwp"  "2635" "qnjx" 
> class(str_split(x, pattern = '_', simplify = TRUE))
# [1] "matrix" "array" 

字符串向量拆分后选择特定的列,用于后续操作,比如本例中拆分后选取数字列,则可以使用矩阵和数组选取子集的操作。

> str_split(x, pattern = '_', simplify = TRUE)[,2]
[1] "123"  "236"  "178"  "109"  "2635"

字符串子集

可以使用str_subset()根据某一特征选取向量中的特定的字符串,也可以结合正则表达式进行选择。参数包括patternnegatenegate默认是FALSE,如果是TRUE,作用是反选

> x <- c("why", "video", "cross", "extra", "deal", "authority")
> str_subset(x, pattern = 'o')
[1] "video"     "cross"     "authority"
> str_subset(x, pattern = 'o', negate = T)
[1] "why"   "extra" "deal" 

如果使用正则表达式,则和不使用存在不同,如下举例。

> x <- c("why", "video", "cross", "extra", "deal", "authority")
> str_subset(x, pattern = 'oi')
# character(0)
> str_subset(x, pattern = '[oi]')
[1] "video"     "cross"     "authority"

字符串替换

使用str_replace()进行特定字符的替换,参数包括要替换的模式pattern和替换成的模式replacement

> x <- c("why", "video", "cross", "extra", "deal", "authority")
> str_replace(x, 'i', '@')
[1] "why"       "v@deo"     "cross"     "extra"     "deal"      "author@ty"

使用正则表达式后则有所不同:

> str_replace(x, 'ie', '@@')
[1] "why"       "video"     "cross"     "extra"     "deal"      "authority"
> str_replace(x, '[ie]', '@@')
[1] "why"        "v@@deo"     "cross"      "@@xtra"     "d@@al"      "author@@ty"

注意,str_replace只替换匹配到的第一个,使用str_replace_all()进行全部替换:

> x <- c('apple', 'happy')
> x
[1] "apple" "happy"
> str_replace(string = x, pattern = 'p', replacement = '%')
[1] "a%ple" "ha%py"
> str_replace_all(string = x, pattern = 'p', replacement = '%')
[1] "a%%le" "ha%%y"

另外,使用str_replace_na()缺失值的替换,

> x <- c('one',  NA,'ten', NA, 'eleven',NA)
> x
[1] "one"    NA       "ten"    NA       "eleven" NA   
> str_replace_na(string = x, replacement = '%')
[1] "one"    "%"      "ten"    "%"      "eleven" "%" 

字符串填补

使用str_pad()函数进行字符串的填补,参数包括string, width, side = c("left", "right", "both"), pad = " "),举例如下:

> str_pad(string = letters[1:7], width = 5, side = 'left', pad = '#')
[1] "####a" "####b" "####c" "####d" "####e" "####f" "####g"

> str_pad(string = letters[1:7], width = 5, side = 'both', pad = '#')
[1] "##a##" "##b##" "##c##" "##d##" "##e##" "##f##" "##g##"

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

推荐阅读更多精彩内容