官术网_书友最值得收藏!

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語句中應用這些函數。

主站蜘蛛池模板: 潜山县| 楚雄市| 常德市| 乐都县| 增城市| 舞钢市| 杭锦后旗| 建阳市| 灵台县| 布拖县| 嘉定区| 大方县| 抚远县| 格尔木市| 浏阳市| 白银市| 咸丰县| 沁水县| 江安县| 乌鲁木齐市| 库尔勒市| 遂昌县| 黄陵县| 五莲县| 寻甸| 哈尔滨市| 龙泉市| 大安市| 集安市| 伊金霍洛旗| 清流县| 望江县| 龙江县| 沧州市| 连南| 宁陵县| 遂溪县| 宁化县| 六盘水市| 临沧市| 常熟市|