在挖掘分析的过程当中对字符串的处理是极为重要的,且出现也较为频繁,R语言作为当前最为流行的开源数据分析和可视化平台,虽然文本的处理并不是它的强项, 但是R语言还是包含大量的字符串操作工具,本章着重整理了部分常用字符处理函数及其使用方法。
5.1 基本字符操作
1) 字符长度统计
length(x)函数 — 返回向量x的长度,或者说向量中元素的个数;
nchar(x)函数 — 返回向量x中的每个元素的字符个数,对于非字符元素会得到不可预料的结果。
– 举例1:
x <-c("R", "Rstudio", "Revolution R")
# 返回3,向量x中共有3个元素
length(x)
# 返回1 7 12,向量x中每个元素的字符个数
nchar(x)
– 举例2:
# 返回1,空向量长度为1
length("")
# 返回0,空向量字符长度为0
nchar("")
# 非字符元素NA,返回错误结果2
nchar(NA)
2) 字符大小写转换
toupper(x)函数 — 将字符矩阵x内各元素转化为大写形式;
tolower(x)函数 — 将字符矩阵x内各元素转化为小写形式;
casefold(x,upper = FALSE)函数 — 将字符矩阵x内各元素转化为大写或小写形式,默认为转换为小写,当upper =TRUE时转换为大写;
– 举例1:
x <- c("r", "rstudio", "revolutionR", NA)
# 转化x中的各元素为大写形式,NA依然返回NA
toupper(x)
# 转化x中的各元素为小写形式,NA依然返回NA
tolower(x)
# 转化x中的各元素为小写形式,默认upper = FALSE,NA依然返回NA
casefold(x)
# 转化x中的各元素为大写形式,设置upper = TRUE,NA依然返回NA
casefold(x, upper = TRUE)
5.2 字符串连接
字符串连接是较为常见的字符操作,在此R提供了强大的paste函数,它不仅可以实现字符串的连接,也可以实现字符向量的连接,无论是字符向量还是字符串,在连接前paste会把对象首先转换为字符而后进行连接,另外,当向量连接时,较短的向量会循环使用。
1) paste 函数
基本语法:
paste (..., sep = " ", collapse = NULL)
参数sep表示连接的分隔符,默认为一个空格,参数collapse作为合并成一个字符串时的分隔符,详情请见以下应用实例:
– 举例1:
x <- "Hello"; y <- "world"
paste(x, y)
#不设置sep,默认以空格分割
paste("A", 1:4)
#设置sep,去掉空格分隔符
paste("A", 1:4, sep = "")
– 举例2:
#字符向量的连接,较短的字符循环被使用
paste(c("a", "b"), 1:3, sep = "")
– 举例3:
#连接前隐式转换为字符串
name <- c("Kingsley", "William","Tom");
age <- c(30, 20, 10);
person <- data.frame(name, age)
#返回结果"NJc(1,3, 2)" "NJc(30, 20,10)"
paste("NJ", person, sep ="")
注: 数据框内的字符串会默认转换为因子(依赖于stringsAsFactors参数的设置,默认为True,即字符会被转换为因子类型),然后paste连接的时候会进行隐式转换,默认转换为字符型连接,所以使用paste函数时,有时候并不能得到想要的结果。
– 举例4:
#使用collapse参数, collapse的使用可使连接后的字符组成一个字符串
#返回字符串A1,A2,A3,A4
paste("A", 1:4, sep ="" ,collapse = ",")
2) paste0 函数
基本语法:
paste0(..., collapse = NULL)
参数意义paste与函数相同, 不同之处在于sep默认设置为空字符。
– 举例1:
#结果中没有空格分隔符
paste0("A", 1:4)
3) sprintf函数
基本语法:
sprintf(fmt,...)
sprintf表示字符串“打印”,把若干元素按照给定的格式组合赋值给字符串。fmt表示包含格式字符的字符向量,sprintf中的参数会循环使用。
– 举例1:
#以固定长度输出月份的名称,fmt被循环使用,长度不足在字符前面补空格
sprintf("%09s", month.name)
#以固定长度输出月份的名称,fmt被循环使用,长度不足在字符后面补空格
sprintf("%-9s", month.name)
– 举例2:
#向量元素按顺序组合
sprintf(c("Name:%s", "Age: %s"), c("Kingsley", "30"))
– 举例3:
#以指定格式输出圆周率
sprintf("%f",pi)
sprintf("%.3f",pi)
sprintf("%1.0f",pi)
sprintf("%5.1f",pi)
sprintf("%05.1f",pi)
sprintf("%+f",pi)
sprintf("%f", pi)
sprintf("%-10f",pi) # left justified
sprintf("%e",pi)
sprintf("%E",pi)
sprintf("%g",pi)
sprintf("%g", 1e6 * pi) # -> exponential
sprintf("%.9g",1e6 * pi) # -> "fixed"
sprintf("%G",1e-6 * pi)
4) cat函数
基本语法:
cat(... , file ="", sep = " ", fill = FALSE, labels = NULL,
append = FALSE)
cat函数用于连接字符串并输出到文件,默认file为空直接输出;sep表示连接的分隔符,默认为一个空格;fill逻辑值,为FALSE只有显式地使用“\n”才会换行输出,为TRUE只要达到选择宽度即可换行;labels为行标签,只在fill = TRUE时有效,若设定的行数小于实际行数,则会循环使用。append逻辑值,为FALSE会覆盖之前的输出,否则在原来内容后添加新输出。
– 举例1:
#连接字符串,此处A不会循环使用
cat("A", 1:4, sep= " ")
– 举例2:
#换行输出到文件abc.txt,每行都有相应的行标签
cat(paste(letters, 100*1:26), file = "abc.txt", fill = T, labels = paste0("{",1:10, "}:"))
5.3 字符匹配
R语言有多重方法判断特定元素(vector)在另一个元素(vector)中是否存在匹配的元素。下面逐一介绍各种方法:
1. match函数族
match函数族用于匹配字符时返回匹配或部分匹配的元素下标,匹配参数不支持正则表达式。
1) match函数
基本语法:
match(x, table,nomatch = NA_integer_, incomparables = NULL)
其中参数nomatch表示不匹配时的返回值(默认为NA,强制为integer型),incomparables指定不能用来匹配的值(vector),因此incomparables中配置的值,即使x在table中得到匹配也会由nomatch代替。match函数要求完全匹配。
– 举例1:
#return 2,字符mn匹配字符向量第二个元素的值
match("mn",c("ab", "mn", "xy"), nomatch = NA)
– 举例2:
#return 1,字符mn匹配字符向量第一以及第二个元素的值,返回第一个元素下标
match("mn",c("mn", "mn", "xy"), nomatch = NA)
– 举例3:
#return NA,incomparables包含了字符值mn,因此即使匹配也返回NA
match("xy",c("ab", "mn", "xy"), nomatch = NA,incomparables = c("mn", "xy"))
函数%in%,实际可表示为match函数,不同的是返回值为逻辑向量
"%in%"<- function(x, table) match(x, table, nomatch = 0) > 0
– 举例1:
#返回长度为10的逻辑向量,存在的为TRUE,不存在为FALSE
1:10 %in%c(1,3,5,9)
– 举例2:
#返回sstr中存在于26个字符中的元素,包括大小写
sstr <-c("c","ab","B","bba","c",NA,"@","bla","a","Ba","%")
sstr[sstr %in%c(letters, LETTERS)]
2) pmatch函数
基本语法: