R语言——字符串
参考资料:学习R
文本数据存储在字符向量中。重要的是,字符向量中的每个元素都是字符串,而非单独的字符。
文本的基本单位是字符向量,着意味着大部分字符串处理函数也能用于字符向量。
1、创建和打印字符串
字符向量可用c函数创建。我们可以用单引号或双引号把字符串引起来,只要引号之间匹配即可。建议使用双引号。
paste函数能将不同字符串组合起来。在它传入的参数向量中,每个元素都能够自我循环以达到最长的矢量长度,然后字符串就被拼接在一起,中间以空格分开。可以使用参数sep更改分隔符,或使用相关的paste0函数去掉分隔符。所有的字符串组合后,可使用collapse参数把结果收缩成一个包含所有元素的字符串。
paste(c("red","yellow"),"lorry")
paste(c("red","yellow"),"lorry",sep="-")
paste(c("red","yellow"),"lorry",collapse=", ")
paste0(c("red","yellow"),"lorry")
toString函数是paste的变种,它在打印向量时非常有用。它使用逗号和空格分隔每个元素,且可限制打印的数量。
x<-(1:15)^2
toString(x)
toString(x,width=40)
cat是一个低级函数,很少直接调用它
通常情况下,当字符串打印到控制台时,它们会议双引号括起来。如果对它们使用noquote函数,就可以去掉这些引号。有时,这会使文本更具可读性。
x<-c("I","saw","a","saw","that","could","out",
"saw","any","other","saw","I","ever","saw")
y<-noquote(x)
print(x)
print(y)
2、格式化数字
有几个函数可用于数字的格式化。formatC可以让我们用C语言的格式化风格来指定使用固定型或科学型的格式、小数的位数以及输出的宽度。无论使用哪种选项,输入都应该是numeric类型,且输出是character字符向量或数组:
pow<-1:3
powers_of_e<-exp(pow)
formatC(powers_of_e)
# 指定3个数字
formatC(powers_of_e,digits=3)
# 前面加上空格
formatC(powers_of_e,digits=3,width=10)
# 科学格式
formatC(powers_of_e,digits=3,format="e")
# 前面加上+
formatC(powers_of_e,digits=3,flag="+")
R还提供了更通用的C风格的格式化函数sprintf。与sprintf在其他语言中的工作方式一眼:第一个参数包含字符串或数字变量的占位符,其他参数则将逐个代入这些占位符。不过请注意,R中大部分的数值是浮点型的而非整数型的。
sprintf的第一个参数指定了一个格式化字符串,其中包括其他值得占位符。例如:%s代表另一个字符串,%f和%e分别代表固定型格式和科学型格式的浮点数,%d表示整数。其他参数的值将替换占位符。与paste函数类似,较短长度的输入将循环自身以匹配最长的输入。
sprintf("%s %d = %f","Euler's constant to the power",pow,powers_of_e)
sprintf("To three decimal places, e ^ %d = %.3f",pow,powers_of_e)
sprintf("In scientific notation, e ^ %d = %e",pow,powers_of_e)
其他格式化数字的方法有format和prettyNum两个函数。format提供的格式化字符串的语法与formatC的用法基本类似。而prettyNum则非常适合于格式化那些非常大火非常小的数字:
format(powers_of_e)
# 保留2位小数
format(powers_of_e,digits=3)
# 去掉多余的0
format(powers_of_e,digits=3,trim=TRUE)
# 保留两位小数的科学计数
format(powers_of_e,digits=3,scientific = TRUE)
# 使用prettyNum函数
prettyNum(
c(1e10,1e-20),
big.mark = ",",
small.mark = " ",
preserve.width = "individual",
scientific=FALSE
)
3、特殊字符
有一些特殊字符可以被包含在字符串中。例如,我们可以通过\t插入一个制表符。在下例中,我们使用cat而非print,因为print执行的额外转换动作会把制表符\t转换成反斜杠和一个t。cat的参数fill=TRUE使光标在一行结束后移动到下一行:
cat("foo\tbar",fill=TRUE)
将光标移动到下一行是通过打印换行符\N完成的(在R中,不要使用\r或\r\n来打印换行符,因为\r会将光标移动到当前行的开始并覆盖我们所写的内容);
cat("foo\nbar",fill=TRUE)
打印反斜杠时需要连续输入两个反斜杠,以免被误认为是特殊字符:
cat("foo\\bar",fill=TRUE)
如果我们需要在字符串中使用双引号,那么双引号前必须添加一个反斜杠来转义。同样,如果我们要在字符串中使用单引号,则单引号需要被转义:
cat("foo'bar",fill=TRUE)
cat("foo\'bar",fill=TRUE)
cat("foo\"bar",fill=TRUE)
与之相反,如果在被双引号引用的字符串中使用单引号,或在单引号引用的字符串中使用双引号,则并不需要对其进行转义。
通过打印警报符\a能让我们的电脑发出提示音,不过alarm函数也能完成此功能且可读性更好。当想要程序在一个耗时很长的分析任务结束后主动通知我们,可以使用这个函数。
4、更改大小写
使用toupper和tolower函数能把字符串中的字符全部转换为大写或小写:
toupper("I'm Shouting")
tolower("I'm Whispering")
5、截取字符串
有两个函数可以用于从字符串中截取子串:substring和substr。在大多数情况下,我们可以任意使用其中一个。不过,如果我们传入了不同长度的向量参数,它们的行为会略有不同。对substring来说,输出的长度与最长的输入一样;而对于substr函数来说,输出的长度只与第一个输入的相等:
woodchuck<-c(
"How much wood would a woodchuck chuck",
"If a woodchuck could chuck wood",
"He would chuck, he would, as much as he could",
"And chuck as much wood as a woodchuck would",
"If a woodchuck could chuck wood."
)
substring(woodchuck,1:6,10)
substr(woodchuck,1:6,10)
6、分割字符串
paste及其相关函数能把字符串组合起来。strsplit则正好相反,它在指定的某些点上分割字符串。我们可以把上例中的字符串按照空格分开。在下面,fixed=TRUE意味着split的参数是固定长度的字符串而非正则表达式:
strsplit(woodchuck," ",fixed=TRUE)
注意,strsplit返回的是列表(而非字符向量或矩阵)。这是因为它的结果可能由不同长度的字符向量组成。
在我们的例子中,某些词最后的逗号有些烦人。最好的方法是在空格分割符前加一个可选的逗号,使用正则表达式就很容易搞定,?意味着“前面的字符可选”:
strsplit(woodchuck,",? ")
7、文件路径
R有一个工作目录,默认为文件被读写的地方。我们可以使用getwd查看它的位置,并使用setwd来改变它:
getwd()
setwd("C:/users/...")
这里需要注意,每个路径的目录部分由正斜杠分隔。我们也可以使用双反斜杠来表示Windows的路径,不过正斜杠仍为首选。
我们可以使用file.path来从各个目录中创建文件路径。它会自动地在目录名称之间插入正斜杠:
file.path("C:","Program Files","R","R-devel")
路径可以是绝对路径(从驱动器名称或网络共享处开始)或相对路径(相对于当前工作目录)。在后一种情况中,.用于当前目录,..用于父目录,~代表当前用户主目录。path.expand能将相对路径转换为绝对路径:
path.expand(".")
path.expand("..")
path.expand("~")
basename只返回文件名,而不包括前面的目录位置。与之相反,dirname只返回文件的目录。
file_name <- "C:/Program Files/R/R-devel/bin/x64/RGui.exe"
basename(file_name)
dirname(file_name)