R高级数据管理——函数

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
image

如果要想尝试帮助文件中的例子,可以使用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 概率函数

与统计函数类似,但通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值。常见的概率函数如下:

image

在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" )

image

函数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个观测:

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 字符处理函数

数学函数、统计函数和概率函数用于处理数值型数据,而利用字符处理函数可以从文本型数据中抽取信息。

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"

你可能感兴趣的:(R高级数据管理——函数)