1.数值与字符处理函数
R语言中数据处理最重要的函数:数值(数学、统计、概率)函数和字符处理函数。
1.1 数学函数
#绝对值
abs(x)
#平方根
sqrt(x)
#不小于x的最小整数
ceiling(x)
#不大于x的最大整数
floor(x)
#向0的方向截取x的整数部分
trunc(x)
#将x舍入为指定位的小数
round(x, digits=n)
#将x舍入为指定的有效数字位数
signif(x, digits=n)
#三角函数家族
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为底的对数
log(x, base=n)
#对x取以e为底的对数
log(x)
#对x取以10为底的对数
log10(x)
#e的指数函数
exp(x)
数值(数学、统计、概率)函数用在向量、矩阵、数据框时,单独用于其中每一个独立的值。
1.2 统计函数
#平均数
mean(x)
#中位数
median()
#标准差
sd(x)
#方差
var(x)
#绝对中位差
mad(x)
#求分位数,其中x为待求分位数的数值型向量,probs为一个由[0,1]之间的概率值组成的数值向量
quantile(x, probs)
#求值域
range(x)
#求和
sum(x)
#滞后差分
diff(x, lag=n)
#求最小值
min(x)
#求最大值
max(x)
#为数据对象x按列进行中心化或标准化
scale(x, center=TRUE, scale=TRUE)
许多统计函数都拥有可以影响输出结果的可选参数,比如下面这行代码:
z <- mean(x, trim = 0.05, na.rm = TRUE)
trim()
为截尾平均数,代码表示去除最大5%和最小5%的数据(即异常值)和所有缺失值后的算术平均数。因此在使用统计函数时,可以获取帮助。这里简单介绍一下如何在R中获得某个函数的帮助信息:
> help(mean)
> ?mean
如果要想尝试帮助文件中的例子,可以使用example()函数来运行他们:
>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 概率函数
与统计函数类似,但通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值。常见的概率函数如下:
在R中,概率函数形如:
[dpqr]distribution_abbreviation()
其中第一个字母表示其所指分布的某一方面:
d = 密度函数(density)
p = 分布函数(distribution function)
q = 分位数函数(quantile function)
r = 生成随机数(随机偏差)
以我们熟悉的正态分布(norm)为例,如果不指定均值和标准差,将生成标准正态分布(即均值为0,标准差为1),相应统计函数有密度函数(dnorm
)、分布函数(pnorm
)、分位数函数(qnorm
)和随机生成函数(rnorm
),下面根据实例简单实践一下:
Q1:如何在在区间[-3, 3]上绘制标准正态曲线
#正态分布
> x <- pretty(c(-3,3), 30)
> y <-dnorm(x)
> plot(x, y,type="l", xlab="NormalDeviate",ylab="Density", yaxs="i" )
函数pretty(x, N)
的含义是对变量x
进行美观分割,主要是将连续变量x
分割为N
个区间(N+1
个端点),并使端点为取整值,常常在绘图中使用。
Q2:位于 z=1.96 左侧的标准正态曲线下方面积是多少?
> pnorm(1.96)
[1] 0.9750021
Q3:均值为500,标准差为100的正态分布的0.9分位点值为多少?
> qnorm(.9, mean=500, sd=100)
[1] 628.1552
Q4:生成50个均值为50,标准差为10的正态随机数?
> 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 设置随机种子
每次生成伪随机数时,函数都会使用一个不同的种子,因此会产生不同的结果。但实际中常常需要让随机结果重现(reproducible),为了实现结果重现可以通过函数set.seed()
指定种子。
下面我们用函数runif()
来生成0到1区间上服从均匀分布的伪随机数。
> 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
随机结果重现创建一些固定的随机示例数据,其目的主要是便于之后随时取用,并与他人共享。
1.3.2 生成多元正态数据
MASS
包中的函数mvrnorm()
可以生成给定均值向量和协方差矩阵的多元正态分布,调用格式为:
> mvrnorm(n, mean, sigma)
n 是样本大小
mean 为均值向量
sigma 是方差-协方差矩阵(或相关矩阵)
假设从如下所示的三元正态分布中抽取500个观测:
> 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 字符处理函数
数学函数、统计函数和概率函数用于处理数值型数据,而利用字符处理函数可以从文本型数据中抽取信息。
1.4.1 nchar()
函数
主要使用来返回字符长度。与它相似的有length()
函数,而length()
则是用来返回字符数量。如下代码可以看出区别:
> 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()
函数
substr(x, start, stop)
substr()
函数用于提取或替换一个字符向量中的子串,例如:
> hello <- "helloeverybody"
> substr(hello,2,5)
[1] "ello"
> substr(hello,2,5) <- "2222"
> hello
[1] "h2222everybody"
1.4.3 grep()
函数
grep(pattern, x, ignore. case=FALSE, fixed=FALSE)
grep()
函数用于在x中搜索某种模式,若fixed=FALSE
,则pattern
为一个正则表达式。若fixed=TRUE
,则pattern
为一个文本字符串,返回值为匹配的下标。
> grep(pattern = "boy", x = c("abcb", "boy", "baby"))
[1] 2
与grep()
函数容易混淆的有grepl()
函数,区别是grepl()
函数返回的是逻辑值:
> grepl(pattern = "boy", x = c("abcb", "boy", "baby"))
[1] FALSE TRUE FALSE
1.4.4 sub()
函数
sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE)
在
x
中搜索pattern
,并以文本replacement
将其替换。若fixed=FALSE
,则pattern
为一个正则表达式。若fixed=TRUE
, 则pattern
为一个文本字符串。需要注意,sub
函数在搜索到第一个pattern
后就会停止,而不会将所有的pattern
都替换掉。
#替换从左到右第一个b为a
> ab <- "abababababab"
> sub("b","a",ab,T)
[1] "aaababababab"
当我们需要将所有的pattern
都替换,则要使用gsub()
函数:
> ab <- "abababababab"
> sub("b","a",ab,T)
[1] "aaababababab"
1.4.5 strsplit()
函数
strsplit(x, split, fixed=FALSE)
在
split
处分割字符向量x
中的元素。若fixed=FALSE
,则pattern
为一个正则表达式。若fixed=TRUE
,则pattern
为一个文本字符串。
> strsplit(ab,"")
[[1]]
[1] "a" "b" "a" "b" "a" "b" "a" "b" "a" "b" "a" "b"
注意上方返回的是一个list
。
1.4.6 paste
函数
paste(…, sep="")
连接字符串,分隔符为
sep
,在不指定分割符的情况下,默认分割符是空格。
> 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()
函数,它与paste
函数的用法相似,唯一的区别就是paste0
在不指定分割符的情况下,默认分割符是空。
> 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()
他们是大小写转换函数。
> toupper("abc")
[1] "ABC"
> tolower("ABC")
[1] "abc"