R语言统计分析与应用
上QQ阅读APP看书,第一时间看更新

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语句中应用这些函数。