1.數(shù)值與字符處理函數(shù)
R語言中數(shù)據(jù)處理最重要的函數(shù):數(shù)值(數(shù)學(xué)涂滴、統(tǒng)計友酱、概率)函數(shù)和字符處理函數(shù)。
1.1 數(shù)學(xué)函數(shù)
#絕對值
abs(x)
#平方根
sqrt(x)
#不小于x的最小整數(shù)
ceiling(x)
#不大于x的最大整數(shù)
floor(x)
#向0的方向截取x的整數(shù)部分
trunc(x)
#將x舍入為指定位的小數(shù)
round(x, digits=n)
#將x舍入為指定的有效數(shù)字位數(shù)
signif(x, digits=n)
#三角函數(shù)家族
cos(x)柔纵、sin(x)缔杉、tan(x)、acos(x)首量、asin(x)壮吩、atan(x)进苍、cosh(x)加缘、sinh(x)、tanh(x)觉啊、acosh(x)拣宏、asinh(x)、atanh(x)
#對x取以n為底的對數(shù)
log(x, base=n)
#對x取以e為底的對數(shù)
log(x)
#對x取以10為底的對數(shù)
log10(x)
#e的指數(shù)函數(shù)
exp(x)
數(shù)值(數(shù)學(xué)杠人、統(tǒng)計勋乾、概率)函數(shù)用在向量、矩陣嗡善、數(shù)據(jù)框時辑莫,單獨(dú)用于其中每一個獨(dú)立的值。
1.2 統(tǒng)計函數(shù)
#平均數(shù)
mean(x)
#中位數(shù)
median()
#標(biāo)準(zhǔn)差
sd(x)
#方差
var(x)
#絕對中位差
mad(x)
#求分位數(shù)罩引,其中x為待求分位數(shù)的數(shù)值型向量各吨,probs為一個由[0,1]之間的概率值組成的數(shù)值向量
quantile(x, probs)
#求值域
range(x)
#求和
sum(x)
#滯后差分
diff(x, lag=n)
#求最小值
min(x)
#求最大值
max(x)
#為數(shù)據(jù)對象x按列進(jìn)行中心化或標(biāo)準(zhǔn)化
scale(x, center=TRUE, scale=TRUE)
許多統(tǒng)計函數(shù)都擁有可以影響輸出結(jié)果的可選參數(shù),比如下面這行代碼:
z <- mean(x, trim = 0.05, na.rm = TRUE)
trim()
為截尾平均數(shù)袁铐,代碼表示去除最大5%和最小5%的數(shù)據(jù)(即異常值)和所有缺失值后的算術(shù)平均數(shù)揭蜒。因此在使用統(tǒng)計函數(shù)時横浑,可以獲取幫助。這里簡單介紹一下如何在R中獲得某個函數(shù)的幫助信息:
> help(mean)
> ?mean
image
如果要想嘗試幫助文件中的例子屉更,可以使用example()函數(shù)來運(yùn)行他們:
>example(mean)
mean> x <- c(0:10, 50)
mean> xm <- mean(x)
mean> c(xm, mean(x, trim = 0.10))
[1] 8.75 5.50
1.3 概率函數(shù)
與統(tǒng)計函數(shù)類似徙融,但通常用來生成特征已知的模擬數(shù)據(jù),以及在用戶編寫的統(tǒng)計函數(shù)中計算概率值瑰谜。常見的概率函數(shù)如下:
image
在R中欺冀,概率函數(shù)形如:
[dpqr]distribution_abbreviation()
其中第一個字母表示其所指分布的某一方面:
d = 密度函數(shù)(density)
p = 分布函數(shù)(distribution function)
q = 分位數(shù)函數(shù)(quantile function)
r = 生成隨機(jī)數(shù)(隨機(jī)偏差)
以我們熟悉的正態(tài)分布(norm)為例,如果不指定均值和標(biāo)準(zhǔn)差似舵,將生成標(biāo)準(zhǔn)正態(tài)分布(即均值為0脚猾,標(biāo)準(zhǔn)差為1),相應(yīng)統(tǒng)計函數(shù)有密度函數(shù)(dnorm
)砚哗、分布函數(shù)(pnorm
)龙助、分位數(shù)函數(shù)(qnorm
)和隨機(jī)生成函數(shù)(rnorm
),下面根據(jù)實(shí)例簡單實(shí)踐一下:
Q1:如何在在區(qū)間[-3, 3]上繪制標(biāo)準(zhǔn)正態(tài)曲線
#正態(tài)分布
> x <- pretty(c(-3,3), 30)
> y <-dnorm(x)
> plot(x, y,type="l", xlab="NormalDeviate",ylab="Density", yaxs="i" )
image
函數(shù)pretty(x, N)
的含義是對變量x
進(jìn)行美觀分割蛛芥,主要是將連續(xù)變量x
分割為N
個區(qū)間(N+1
個端點(diǎn))提鸟,并使端點(diǎn)為取整值,常常在繪圖中使用仅淑。
Q2:位于 z=1.96 左側(cè)的標(biāo)準(zhǔn)正態(tài)曲線下方面積是多少称勋?
> pnorm(1.96)
[1] 0.9750021
Q3:均值為500,標(biāo)準(zhǔn)差為100的正態(tài)分布的0.9分位點(diǎn)值為多少涯竟?
> qnorm(.9, mean=500, sd=100)
[1] 628.1552
Q4:生成50個均值為50赡鲜,標(biāo)準(zhǔn)差為10的正態(tài)隨機(jī)數(shù)?
> rnorm(50, mean=50, sd=10)
[1] 51.33490 48.57706 63.51390 46.34352 57.88116 40.30345 58.08860 58.95951 45.35611 42.69611
[11] 47.76489 41.05805 60.20043 49.74406 43.57572 53.75946 66.51277 66.87900 43.25843 51.15859
[21] 42.49729 37.72957 42.39132 43.02164 46.36055 48.86809 61.88639 57.24349 45.76143 41.22546
[31] 52.29699 52.35126 55.69051 56.22872 57.49280 42.42788 30.55075 39.33785 51.86386 64.30678
[41] 51.87697 46.50459 57.92250 45.02302 71.30963 38.96372 65.44749 46.62874 42.62878 45.00120
1.3.1 設(shè)置隨機(jī)種子
每次生成偽隨機(jī)數(shù)時庐船,函數(shù)都會使用一個不同的種子银酬,因此會產(chǎn)生不同的結(jié)果。但實(shí)際中常常需要讓隨機(jī)結(jié)果重現(xiàn)(reproducible)筐钟,為了實(shí)現(xiàn)結(jié)果重現(xiàn)可以通過函數(shù)set.seed()
指定種子揩瞪。
下面我們用函數(shù)runif()
來生成0到1區(qū)間上服從均勻分布的偽隨機(jī)數(shù)。
> runif(5)
[1] 0.82012485 0.78120557 0.45770940 0.05807683 0.56365733
> runif(5)
[1] 0.4447013 0.5169131 0.2474369 0.7904778 0.1449952
> set.seed(12)
> runif(5)
[1] 0.06936092 0.81777520 0.94262173 0.26938188 0.16934812
> set.seed(12)
> runif(5)
[1] 0.06936092 0.81777520 0.94262173 0.26938188 0.16934812
隨機(jī)結(jié)果重現(xiàn)創(chuàng)建一些固定的隨機(jī)示例數(shù)據(jù)篓冲,其目的主要是便于之后隨時取用李破,并與他人共享。
1.3.2 生成多元正態(tài)數(shù)據(jù)
MASS
包中的函數(shù)mvrnorm()
可以生成給定均值向量和協(xié)方差矩陣的多元正態(tài)分布壹将,調(diào)用格式為:
> mvrnorm(n, mean, sigma)
n 是樣本大小
mean 為均值向量
sigma 是方差-協(xié)方差矩陣(或相關(guān)矩陣)
假設(shè)從如下所示的三元正態(tài)分布中抽取500個觀測:
image
> options(digits=3)
> set.seed(1234)
> mean <- c(230.7, 146.7, 3.6)
> sigma <- matrix(c(15360.8, 6721.2, -47.1, 6721.2, 4700.9, -16.5, -47.1, -16.5, 0.3), nrow=3, ncol=3)
> mydata <- mvrnorm(500, mean, sigma)
> mydata <- as.data.frame(mydata)
> names(mydata) <- c("y", "x1", "x2")
> dim(mydata)
[1] 500 3
> head(mydata, n=10)
y x1 x2
1 98.8 41.3 3.43
2 244.5 205.2 3.80
3 375.7 186.7 2.51
4 -59.2 11.2 4.71
5 313.0 111.0 3.45
6 288.8 185.1 2.72
7 134.8 165.0 4.39
8 171.7 97.4 3.64
9 167.2 101.0 3.50
10 121.1 94.5 4.10
1.4 字符處理函數(shù)
數(shù)學(xué)函數(shù)嗤攻、統(tǒng)計函數(shù)和概率函數(shù)用于處理數(shù)值型數(shù)據(jù),而利用字符處理函數(shù)可以從文本型數(shù)據(jù)中抽取信息诽俯。
1.4.1 nchar()
函數(shù)
主要使用來返回字符長度妇菱。與它相似的有length()
函數(shù),而length()
則是用來返回字符數(shù)量。如下代碼可以看出區(qū)別:
> x="John"
> y=c("Jim","Tony","kavry")
> nchar(x)
[1] 4
> nchar(y)
[1] 3 4 5
> length(x)
[1] 1
> length(y)
[1] 3
1.4.2 substr()
函數(shù)
substr(x, start, stop)
substr()
函數(shù)用于提取或替換一個字符向量中的子串恶耽,例如:
> hello <- "helloeverybody"
> substr(hello,2,5)
[1] "ello"
> substr(hello,2,5) <- "2222"
> hello
[1] "h2222everybody"
1.4.3 grep()
函數(shù)
grep(pattern, x, ignore. case=FALSE, fixed=FALSE)
grep()
函數(shù)用于在x中搜索某種模式密任,若fixed=FALSE
,則pattern
為一個正則表達(dá)式偷俭。若fixed=TRUE
浪讳,則pattern
為一個文本字符串,返回值為匹配的下標(biāo)涌萤。
> grep(pattern = "boy", x = c("abcb", "boy", "baby"))
[1] 2
與grep()
函數(shù)容易混淆的有grepl()
函數(shù)淹遵,區(qū)別是grepl()
函數(shù)返回的是邏輯值:
> grepl(pattern = "boy", x = c("abcb", "boy", "baby"))
[1] FALSE TRUE FALSE
1.4.4 sub()
函數(shù)
sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE)
在
x
中搜索pattern
,并以文本replacement
將其替換负溪。若fixed=FALSE
透揣,則pattern
為一個正則表達(dá)式。若fixed=TRUE
川抡, 則pattern
為一個文本字符串辐真。需要注意,sub
函數(shù)在搜索到第一個pattern
后就會停止崖堤,而不會將所有的pattern
都替換掉侍咱。
#替換從左到右第一個b為a
> ab <- "abababababab"
> sub("b","a",ab,T)
[1] "aaababababab"
當(dāng)我們需要將所有的pattern
都替換,則要使用gsub()
函數(shù):
> ab <- "abababababab"
> sub("b","a",ab,T)
[1] "aaababababab"
1.4.5 strsplit()
函數(shù)
strsplit(x, split, fixed=FALSE)
在
split
處分割字符向量x
中的元素密幔。若fixed=FALSE
楔脯,則pattern
為一個正則表達(dá)式。若fixed=TRUE
胯甩,則pattern
為一個文本字符串昧廷。
> strsplit(ab,"")
[[1]]
[1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
注意上方返回的是一個list
。
1.4.6 paste
函數(shù)
paste(…, sep="")
連接字符串偎箫,分隔符為
sep
木柬,在不指定分割符的情況下,默認(rèn)分割符是空格镜廉。
> paste("Today is", date())
[1] "Today is Thu Mar 19 20:37:10 2020"
> paste("x",1:3,sep="M")
[1] "xM1" "xM2" "xM3"
如果在paste
后面加一個0變成paste0()
函數(shù)弄诲,它與paste
函數(shù)的用法相似愚战,唯一的區(qū)別就是paste0
在不指定分割符的情況下娇唯,默認(rèn)分割符是空。
> paste0("Today is", date())
[1] "Today isThu Mar 19 20:41:38 2020"
> paste0("x",1:3,sep="M")
[1] "x1M" "x2M" "x3M"
1.4.7 toupper()
和tolower()
他們是大小寫轉(zhuǎn)換函數(shù)寂玲。
> toupper("abc")
[1] "ABC"
> tolower("ABC")
[1] "abc"