2.2 R常用函数及其应用
R函数是一个子程序,它由0个或几个自变量返回一个结果值。每个R函数都有一个关键名字。为了引用函数,要写出它的名字,然后写出一个自变量或几个自变量,并用括号括起来,这个函数对这些自变量进行某种运算。R函数的形式为:
Functionname(variable1,variable2 ┉)
例如SUM(math,English,Chinese),SUM函数计算变量math、English和Chinese的和。又如MIN(X,Y),MIN函数比较两个自变量的值并返回这两个值的最小值。
本节我们将综述R中作为数据处理基石的函数,它们可分为数值(数学、统计、概率)函数和字符处理函数。
2.2.1 数学函数
以下为常用的数学函数和简短的用例。
·abs(x):绝对值。
> abs(-4) [1] 4
·sqrt(x):平方根。
> sqrt(25) [1] 5 > 25^(0.5) [1] 5
·ceiling(x):不小于x的最小整数。
> ceiling(3.475) [1] 4
·floor(x):不大于x的最大整数。
> floor(3.475) [1] 3
·trunc(x):向0的方向截取的x中的整数部分。
> trunc(5.99) [1] 5
·round(x, digits=n):将x舍入为指定位的小数。
> round(3.475, digits=2) [1] 3.48
·signif(x, digits=n):将x舍入为指定的有效数字位数。
> signif(3.475, digits=2) [1] 3.5
·cos(x):余弦。
> cos(2) [1] -0.4161468
·sin(x) :正弦。
> sin(2) [1] 0.9092974
·tan(x):正切。
> tan(2) [1] -2.18504
·acos(x):反余弦。
> acos(-0.416) [1] 1.999839
·asin(x):反正弦。
> asin(-0.416) [1] -0.4290422
·atan(x):反正切。
> atan(-0.416) [1] -0.3942229
·cosh(x):双曲余弦。
> cosh(2) [1] 3.762196
·sinh(x):双曲正弦。
> sinh(2) [1] 3.62686
·tanh(x):双曲正切。
> tanh(2) [1] 0.9640276
·acosh(x):反双曲余弦。
> acosh(2.0) [1] 1.316958
·asinh(x):反双曲正弦。
> asinh(3.627) [1] 2.000037
·atanh(x):反双曲正切。
> atanh(0.22) [1] 0.2236561
·log(x,base=n):对x取以n为底的对数。
> log(8,2) [1] 3
·log(x):自然对数。
> log(10) [1] 2.302585
·log10(x):常用对数。
> log10(40) [1] 1.60206 > log(40,10) [1] 1.60206
·exp(x):指数函数。
> exp(2) [1] 7.389056
对数据做变换是这些函数的一个主要用途。数学函数也被用作公式中的一部分,用于绘图函数和在输出结果之前对数值做格式化。
2.2.2 样本统计函数
以下为常用的样本函数和简短的用例。
·mean(x):平均数。
> mean(c(1,2,3,4)) [1] 2.5
·median(x):中位数。
> median(c(1,2,3,4,5)) [1] 3
·sd(x):标准差。
> sd(c(1,2,3,4,5,6,7)) [1] 2.160247
·var(x):方差。
> var(c(1,2,3,4,5,6,7)) [1] 4.666667
·mad(x):绝对中位差。
> mad(c(1,2,3,4,5,6,7)) [1] 2.9652
·quantile(x,probs):求分位数。其中x为待求分位数的数值型向量,probs为一个由[0,1]之间的概率值组成的数值向量。
求向量x的第25和第75百分位数:
> quantile(c(1,2,3,4,5,6,7),c(.25,.75)) 25% 75% 2.5 5.5
·range(x):求值域。
> range(c(1,2,3,4,5,6,7)) [1] 1 7 > diff(range(c(1,2,3,4,5,6,7))) [1] 6
·sum(x):求和。
> sum(c(1,2,3,4,5,6,7)) [1] 28
·diff(x, lag=n):滞后差分,lag用以指定滞后几项。默认的lag值为1。
> x<- c(1, 5, 23, 29) > diff(x) [1] 4 18 6
·min(x):最小值。
> min(c(1,2,3,4,5,6,7)) [1] 1
·max(x):最大值。
> max(c(1,2,3,4,5,6,7)) [1] 7
·scale(x,center=TRUE, scale=TRUE):为数据对象x按列进行中心化(center=TRUE)或标准化(center=TRUE, scale=TRUE)。
默认情况下,函数scale()对矩阵或数据框的指定列进行均值为0、标准差为1的标准化:
mydata <- scale (mydata)
要对每一列进行任意均值和标准差的标准化,可以使用如下代码:
mydata <- scale (mydata)*SD+M
其中,M是想要的均值,SD为想要的标准差。
以下代码演示了计算某个数值向量的均值和标准差的两种方式,有助于理解统计函数。
> x <- c(1,2,3,4,5,6,7,8,9,15,12) > mean(x) [1] 6.545455 > sd(x) [1] 4.274661 > n<- length(x) > meanx <- sum(x)/n > css <- sum((x-meanx)^2) > sdx <- sqrt(css/(n-1)) > meanx [1] 6.545455 > sdx [1] 4.274661
2.2.3 概率函数
概率函数通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值。
在R中,概率函数形如:
[dpqr]distribution_abbrevation()
其中第一个字母表示其所指分布的某一方面。
·d=密度函数(density)。
·p=分布函数(distribution function)。
·q=分位数函数(quantile function)。
·r=生成随机数(随机偏差)。
常用的概率函数和缩写如下。
·Beta分布:beta。
·Logistic分布:logis。
·二项分布:binom。
·多项分布:multinom。
·柯西分布:cauchy。
·负二项分布:nbinom。
·(非中心)卡方分布:chisq。
·正态分布:norm。
·指数分布:exp。
·泊松分布:pois。
·F分布:f。
·Wilcoxon符号秩分布:signrank。
·Gamma分布:gamma。
·t分布:t。
·几何分布:geom。
·均匀分布:unif。
·超几何分布:hyper。
·Weibull分布:weibull。
·对数正态分布:lnorm。
·Wilcoxon秩和分布:wilcox。
我们以正态分布函数为例,了解这些函数的使用方法。如果不指定一个均值和标准差,则函数将假定其为标准正态分布(均值为0,标准差为1)。密度函数(dnorm)、分布函数(pnorm)、分位数函数(qnorm)和随机数生成函数(rnorm)的使用。标准正态分布概率密度函数如图2-1所示。
▲图2-1 标准正态分布概率密度函数
> x <- pretty(c(-3,3), 30) > y <-dnorm(x) plot(x, y, type="l", xlab="NormalDeviate", ylab="Density", yaxs="i" )
位于z=1.96左侧的标准正态曲线下方面积是多少?
> pnorm(1.96) [1] 0.9750021
标准正态分布的0.975分位点值为多少?
> qnorm(.975) [1] 1.959964
均值为500,标准差为100的正态分布的0.9分位点值为多少?
> qnorm(.9, mean=500, sd=100) [1] 628.1552
生成50个均值为50,标准差为10的正态随机数。
> rnorm(50, mean=50, sd=10) [1] 57.86568 65.15495 47.67627 57.58522 51.54444 59.29841 60.00383 67.83573 [9] 51.72464 60.84461 30.48510 30.39757 46.26959 51.60296 45.61807 49.22042 [17] 60.76764 40.72064 53.75776 58.18664 56.91128 40.66373 45.59667 49.54243 [25] 54.24555 45.09342 42.04018 49.76482 52.20662 29.72038 50.26902 34.14525 [33] 47.51494 37.97045 42.22522 46.45015 56.12777 45.11604 53.29744 53.34638 [41] 51.84571 68.33274 38.24069 47.35651 56.88580 43.39235 47.03165 55.79904 [49] 51.18197 40.79011
2.2.4 字符处理函数
数学和统计函数是用来处理数值型数据的,而字符处理函数可以从文本型数据中抽取信息,或者为打印输出和生成报告重设文本的格式。一些常用的字符处理函数如下所示。
·nchar(x):返回字符串x中的字符数量。
> x <- c("ab", "cde", "dsdesd") > length(x) [1] 3 > nchar(x[3]) [1] 6
·substr(x, start, stop):函数返回给定字符串x中指定位置范围start:stop上的子字符串。
> x <- "abcdefghij" > substr(x, 2, 4) [1] "bcd" > substr(x, 2, 4) <- "22222" > x [1] "a222efghij"
·grep(pattern, x, ignore. case=FALSE, fixed=FALSE):在字符串向量x中搜索给定的子字符串pattern。如果x有n个元素,即包括n个字符串,则grep(pattern, x)会返回一个长度不超过n的向量。若fixed=FALSE,则pattern为一个正则表达式;若fixed=TRUE,则pattern为一个文本字符串,返回值为匹配的下标。
> grep("A",c("b","A","c"),fixed=TRUE) [1] 2 > grep("A",c("b","A","c"),fixed=FALSE) [1] 2
·sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE):在x中搜索pattern,并以文本replacement将其替换。若fixed=FALSE,则pattern为一个正则表达式;若fixed=TRUE,则pattern为一个文本字符串。
> sub("\\s",".","Hello There") [1] "Hello.There"
注意,“\s”是一个用来查找空白的正则表达式,使用“\\s”而不用“\”的原因在于后者是R中的转义字符。
·strsplit(x, split, fixed=FALSE):在split处分割字符向量x中的元素拆分成若干个子字符串,返回这些子字符串组成的R列表。若fixed=FALSE,则pattern为一个正则表达式;若fixed=TRUE,则pattern为一个文本字符串。
> y <- strsplit("abc", "") > y [[1]] [1] "a" "b" "c" > unlist(y)[2] [1] "b" unlist(y)[2] > sapply(y, "[", 2) [1] "b" > strsplit("6-16-2011", split="-") [[1]] [1] "6" "16" "2011"
·paste(…, sep=""):把若干个字符串拼接起来,返回一个长字符串,分隔符为sep。
> paste("x", 1:3,sep="") [1] "x1" "x2" "x3" > paste("x",1:3,sep="M") [1] "xM1" "xM2" "xM3" > paste("Today is", date()) [1] "Today is Thu Oct 22 04:58:542015" > paste ("North", "Pole") [1] "North Pole" > paste ("North", "Pole", sep="") [1] "NorthPole" > paste ("North", "Pole", sep=".") [1] "North.Pole" > paste ("North", "and", "Pole", "South") [1] "North and Pole South"
·toupper(x):大写转换。
> toupper("abc") [1] "ABC"
·tolower(x):小写转换。
> tolower("DEF") [1] "def"
·regexpr(pattern, text):在字符串text中寻找pattern,返回与pattern匹配的第一个子字符串的起始字符位置。
> regexpr("uat","Equator") [1] 3
·gregexpr(pattern, text):功能与regexpr()函数一样,不过它会寻找与pattern匹配的全部子字符串的起始位置。
> gregexpr("iss","Missppiissist") [[1]] [1] 2 8
2.2.5 其他实用函数
以下函数对于数据管理和处理同样非常实用。
·length(x):对象x的长度。
> x <- c(1,2,3,4,5,6) > length(x) [1] 6
·seq(from, to, by):生成一个序列。
> mysequ <- seq(1, 20, 3) > mysequ [1] 1 4 7 10 13 16 19
·rep(x, n):将x重复n次。
> rep("ABC",3) [1] "ABC" "ABC" "ABC" > rep(1:3,3) [1] 1 2 3 1 2 3 1 2 3
·cut(x, n):将连续型变量x分割为有着n个水平的因子。
> x <- c(1:100) > cut(x, 5) [1] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] [6] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] [11] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] [16] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] (0.901,20.8] [21] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] [26] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] [31] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] [36] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] (20.8,40.6] [41] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] [46] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] [51] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] [56] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] (40.6,60.4] [61] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] [66] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] [71] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] [76] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] (60.4,80.2] [81] (80.2,100] (80.2,100] (80.2,100] (80.2,100] (80.2,100] [86] (80.2,100] (80.2,100] (80.2,100] (80.2,100] (80.2,100] [91] (80.2,100] (80.2,100] (80.2,100] (80.2,100] (80.2,100] [96] (80.2,100] (80.2,100] (80.2,100] (80.2,100] (80.2,100] Levels: (0.901,20.8) (20.8,40.6) (40.6,60.4) (60.4,80.2) (80.2,100)
·pretty(x, n)创建美观的分割点。通过选取n+1个等间距的取整值,将一个连续型变量x分割为n个区间。
重点提示:R函数在许多数值计算及字符和数值数据处理方面,为简化程序编写过程尤其有用。我们应了解各种函数的功用,掌握一些常见函数的应用,并在R语句中应用这些函数。