一、R函数
- 类似Linux中的命令,每个命令有特定功能。
-
困难之处也在于函数的数量多
- 函数必须加括号
- 返回值
一般函数都有返回值,但这个返回值是多种多样的
(1)返回函数结果
如ls(),列出当前环境中的对象
sys.date(),返回当前系统时间
(2)无返回结果
如rm(),直接删除指定变量,若成功则无任何反馈
(3)返回计算结果
需要清楚返回值类型,数据输出输入格式。之前所学习的数据结构,便是为此打基础。
如绘制热图的heatmap函数,输入数据必须为一个矩阵
输入数据类型:
①向量:sum、mean、sd、range、median、sort、order
②矩阵或数据框:cbind、rbind
③数字矩阵:heatmap
具体可通过help(函数)
、?函数
查看帮助文档
二、选项参数
R中的函数不需要全部记忆,需要了解规律
选项是质,表示选还是不选
参数是量,表示选之后选多少
1.分类
(1)选项:
①输入控制部分,往往放在第一位。
常用选项
file:接一个文件;
data:一般指要输入一个数据框
x:表示单独的一个对象,一般都是向量,也可以是矩阵或者列表;
x和y:函数需要输入两个输入变量;
x,y,z:函数需要三个输入变量;
formula:公式;
na.rm:删除缺失值
...:表示参数可传递,无数量限制
②输出控制部分
③调节部分
注意:a.根据名字判断选项作用。
color选项用来控制颜色,
select与选择,
font与字体,
font.axis坐标轴字体,
lty是line type,
lwd是line width,
method软件和算法
b.选项接受哪些参数
main 字符串,不能是向量
na.rm TRUE或FALSE
axis side参数只能是1到4
fig 包含四个元素的向量
三、数学统计函数
概率论是统计学基础,R中有许多用于处理概率,概率分布以及随机变量的函数。R对每一个概率分布都有一个简称,这个名称用于识别与分布相联系的函数。这部分涉及到很多统计学基础的理论知识,比如随机试验,样本空间,对立与互斥,随机事件与必然事件,概率密度,概率分布等。
1.R概率分布
(1)正态分布,normal distribution
d(density) 概率密度函数
p(distribution) 分布函数
q()分布函数的反函数
r(random)产生相同分布的随机数
(2)离散函数
作用:需要知道每一种分布涉及到的函数,能够使用对应的函数;如果检测对应数据集,是否满足以上某种分布,如,给一个调查问卷的数据,分析其是否满足正态分布、t分布、卡方分布等,能够对其进行检验。
生成随机数
(1)runif()
#生成一个0~1的随机数
> runif(1)
[1] 0.3205146
#生成50个随机数
> runif(50)
[1] 0.72355015 0.46793629 0.13393220 0.25472876 0.60006777 0.85256370 0.39074659 0.41423505
[9] 0.47598901 0.50485926 0.51772890 0.84040754 0.46879700 0.27634808 0.07084798 0.77118456
[17] 0.50110323 0.85208682 0.45609245 0.29467533 0.42306365 0.80427433 0.43338406 0.38248442
[25] 0.16040842 0.85029125 0.18786460 0.33797916 0.35405280 0.39758621 0.15114492 0.15025011
[33] 0.58511908 0.92052279 0.35037683 0.47522564 0.79735311 0.05926597 0.87579173 0.65756016
[41] 0.93343829 0.59329111 0.63892914 0.75169320 0.18751364 0.28062113 0.64821649 0.12933464
[49] 0.41267155 0.34165736
#生成0~1之外的随机数,只需乘一个倍数
> runif(10)*10
[1] 9.1006139 7.4679341 8.4614729 5.2415093 4.1234601 0.3015814 2.4774667 7.5549680 1.6474264
[10] 4.2765827
#控制生成随机数大小范围
> runif(50,min=1,max=100)
[1] 15.558730 42.485893 83.495125 92.749020 82.591896 43.206992 48.693075 6.449010 75.971911
[10] 63.168611 56.835951 99.961384 18.885580 7.016677 48.180309 32.979524 39.021091 1.423197
[19] 76.431950 58.298980 10.645992 81.102787 75.101735 36.423945 34.498627 7.103628 84.867118
[28] 99.370672 74.111178 22.754940 73.383945 45.108024 24.134093 88.351643 2.324923 84.709044
[37] 85.357012 51.036350 32.452384 86.799516 47.882774 95.209789 81.048385 32.552998 83.885253
[46] 45.394076 3.088108 82.769539 89.720810 22.773661
(2)rnorm()
#生成100个平均值15,标准差2的正态分布的随机数
> x=rnorm(n=100,mean = 15,sd=2)
> x
[1] 13.85537 13.73760 10.61393 10.53738 12.49463 14.10920 16.10078 14.66999 11.94613 13.44410
[11] 13.86670 10.17563 17.68459 16.59905 14.97103 14.65451 14.83133 14.76546 16.41581 14.02885
[21] 15.32552 16.40920 13.26202 11.87046 14.16231 12.70598 13.86966 17.93201 17.61617 18.24556
[31] 19.01796 14.12447 19.63545 12.12117 11.01388 14.58617 16.67374 14.62547 15.97744 12.63079
[41] 15.04307 16.91215 15.51013 15.77203 17.16749 14.56760 16.58914 14.96488 14.11927 15.61019
[51] 16.66014 16.63270 10.88551 15.91778 15.21433 16.00746 16.18129 13.35148 16.76288 16.04517
[61] 15.15443 14.52236 11.95257 17.34173 16.77645 17.32065 11.72522 12.59653 16.08145 16.71660
[71] 14.09099 14.21348 12.20576 14.97570 19.29404 12.07027 13.88999 13.40239 16.46703 15.60814
[81] 13.34844 14.36431 17.10270 14.82598 15.64153 15.66530 16.75765 14.66734 15.14969 15.81489
[91] 15.28859 16.18953 16.31448 14.04425 16.84215 14.70762 15.74200 14.51785 17.77974 12.59246
(3)dgamma()
#随机生成的伽马分布的概率密度
> dgamma(c(1:9),shape = 2,rate = 1)
[1] 0.367879441 0.270670566 0.149361205 0.073262556 0.033689735 0.014872513 0.006383174 0.002683701
[9] 0.001110688
- 问题
每次生成的随机数会不一致,若想生成同样的随机数,可通过set.seed()函数。在生成随机数之前,运行set.seed()函数,给一个固定的数字,可以与之前生成的随机数函数状态保持一致
#首先运行这个函数
> set.seed(666)
> runif(50)
[1] 0.77436849 0.19722419 0.97801384 0.20132735 0.36124443 0.74261194 0.97872844 0.49811371
[9] 0.01331584 0.25994613 0.77589308 0.01637905 0.09574478 0.14216354 0.21112624 0.81125644
[17] 0.03654720 0.89163741 0.48323641 0.46666453 0.98422408 0.60134555 0.03834435 0.14149569
[25] 0.80638553 0.26668568 0.04270205 0.61217452 0.55334840 0.85350077 0.46977854 0.39761656
[33] 0.80463673 0.50889739 0.63491535 0.49425172 0.28013090 0.90871035 0.78411616 0.55899702
[41] 0.24443749 0.53097066 0.11839594 0.98338343 0.89775284 0.73857376 0.37731070 0.60616883
[49] 0.51219426 0.98924666
#下面这次发现变了
> runif(50)
[1] 0.06913359 0.08462063 0.12994557 0.74613202 0.03887918 0.68563542 0.14397736 0.89107996
[9] 0.08963612 0.03773272 0.77487436 0.81206388 0.26060255 0.65159500 0.92380385 0.26610612
[17] 0.26613299 0.91091790 0.59056353 0.91814765 0.60379428 0.32826395 0.66611781 0.87478750
[25] 0.06887527 0.79346301 0.57142701 0.04894407 0.98035135 0.91453735 0.76595849 0.77584637
[33] 0.31251505 0.84221731 0.31414991 0.75656389 0.96752438 0.16942292 0.69687518 0.87265079
[41] 0.13247078 0.07851311 0.37822385 0.57962476 0.53642512 0.10853192 0.74031515 0.45178964
[49] 0.64610821 0.74929873
#但是再运行一次666
> set.seed(666)
#可以看见,与第一次runif(50)一致
> runif(50)
[1] 0.77436849 0.19722419 0.97801384 0.20132735 0.36124443 0.74261194 0.97872844 0.49811371
[9] 0.01331584 0.25994613 0.77589308 0.01637905 0.09574478 0.14216354 0.21112624 0.81125644
[17] 0.03654720 0.89163741 0.48323641 0.46666453 0.98422408 0.60134555 0.03834435 0.14149569
[25] 0.80638553 0.26668568 0.04270205 0.61217452 0.55334840 0.85350077 0.46977854 0.39761656
[33] 0.80463673 0.50889739 0.63491535 0.49425172 0.28013090 0.90871035 0.78411616 0.55899702
[41] 0.24443749 0.53097066 0.11839594 0.98338343 0.89775284 0.73857376 0.37731070 0.60616883
[49] 0.51219426 0.98924666
四、描述性统计函数
- summary()
运行一次,就可以对数据进行详细统计,可提供最小值、最大值、四分位数和数值型变量的均值,以及因子向量、逻辑向量 数统计 - fivenum()
与summary类似,可以返回五个基本统计量(最小值、四分位数、中位数、下四分位数、最大值) - hmisc包
describe()函数计算统计量,返回观测的数量、缺失值和唯一值的数目以及平均值,分位数,以及5个最大值和5个最小值 - pastecs包
stat.desc()函数可以计算种类繁多的描述性统一量,其中s是一个数据框或是时间序列 - psych包
describe()函数可以计算非缺失值数量,平均数、标准差、中位数、结尾的均值、最大值、最小值、偏度等。
它还包括一个结尾均值(去掉两头的部分),可通过设置trim参数(trim= 0.1,去除最低和最高10%的部分)。
其实hmisc中也有describe函数,一般来说都是默认以后面载入的那个包为主。
若想使用前面载入的包的describe函数,可以通过使用在包的名字后面加两个冒号,然后接函数的名字。
> Hmisc::describe(mtcars)
- 分组描述
可使用aggregate()函数,能够对数据按照指定分组信息进行统计,将分组信息用列表指定出来即可。
> library(MASS)
#用Cars93来演示(93年产的很多汽车的指标)
#根据汽车制造商来分类(第一列),可看作是一个因子。
#这些列是字符向量,无法进行计算,需要剔除
> aggregate(Cars93[c("Min.Price","Price","Max.Price","MPG.city")],
+ by=list(Manufacturer=Cars93$Manufacturer),mean)
Manufacturer Min.Price Price Max.Price MPG.city
1 Acura 21.05000 24.90000 28.750 21.50000
2 Audi 28.35000 33.40000 38.450 19.50000
3 BMW 23.70000 30.00000 36.200 22.00000
4 Buick 20.75000 21.62500 22.550 19.00000
5 Cadillac 35.25000 37.40000 39.500 16.00000
6 Chevrolet 16.08750 18.18750 20.325 19.62500
7 Chrylser 18.40000 18.40000 18.400 20.00000
8 Chrysler 22.00000 22.65000 23.300 21.50000
9 Dodge 12.51667 15.70000 18.900 21.66667
10 Eagle 12.70000 15.75000 18.850 24.50000
……
#根据origin产地进行比较
> aggregate(Cars93[c("Min.Price","Price","Max.Price","MPG.city")],
+ by=list(Manufacturer=Cars93$Manufacturer),sd)
Manufacturer Min.Price Price Max.Price MPG.city
1 Acura 11.5258405 12.7279221 14.07142495 4.9497475
2 Audi 3.4648232 6.0811183 8.69741341 0.7071068
3 BMW NA NA NA NA
4 Buick 5.0941143 4.5441354 3.99457966 2.4494897
5 Cadillac 3.1819805 3.8183766 4.52548340 0.0000000
6 Chevrolet 7.9660776 8.3044631 8.92168306 3.7392704
7 Chrylser NA NA NA NA
……
#可看出美国产的车更便宜
aggregate一次只能计算一个值
- 分组计算
(1)doBy包
summaryBy()
使用了符号,左侧是需要分析的数值型变量,写数据框列的名字就行,需要添加引号,不同变量之间用+表示,然后是;右侧是类别型分组变量。
然后是data参数指定数据集(接一个数据框)
FUN参数,指定函数,可以是内置函数或者是自定义函数(接一个函数)
这样就一次能完成多个分组、平均值的计算,结果展现在一个表格内。
(2)psych包
describe.by()函数,能够计算相同统一量,by指可通过分组来计算。只需要添加一个需要分组的列表,直接给定一个list即可,结果就会输出很多统计值
优点:适合详细查看每个分组的统计值
缺点:统计值是固定不变的,无法使用自定义的函数
五、频数统计函数
- R如何对数据进行分组
(1)若本身就是因子,则可以直接分组。
如mtcars数据集cyl这一列,可根据气缸数不同来进行分组
> mtcars$cyl <- as.factor(mtcars$cyl)
> split(mtcars,mtcars$cyl)
$`4`
mpg cyl disp hp drat wt qsec vs am gear carb Model
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Datsun 710
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 Merc 240D
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 Merc 230
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 Fiat 128
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 Honda Civic
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 Toyota Corolla
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 Toyota Corona
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 Fiat X1-9
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 Porsche 914-2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 Lotus Europa
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2 Volvo 142E
$`6`
mpg cyl disp hp drat wt qsec vs am gear carb Model
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Hornet 4 Drive
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Valiant
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 Merc 280
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 Merc 280C
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 Ferrari Dino
$`8`
mpg cyl disp hp drat wt qsec vs am gear carb Model
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 Hornet Sportabout
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 Duster 360
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 Merc 450SE
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 Merc 450SL
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 Merc 450SLC
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 Cadillac Fleetwood
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 Lincoln Continental
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 Chrysler Imperial
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 Dodge Challenger
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 AMC Javelin
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 Camaro Z28
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 Pontiac Firebird
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 Ford Pantera L
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 Maserati Bora
(2)非明显因子,使用cut()函数,可以对连续的数据进行切割
#以pg为分组依据,10~50以10为组距进行切割
> cut(mtcars$mpg,c(seq(10,50,10)))
- 频数统计
(1)分组后用table进行频数统计
> table(cut(mtcars$mpg,c(seq(10,50,10))))
> table(cut(mtcars$mpg,c(seq(10,50,10))))
(10,20] (20,30] (30,40] (40,50]
18 10 4 0
(2)prop.table()
prop:proportion 比率
> prop.table(table(mtcars$cyl))
4 6 8
0.34375 0.21875 0.43750
#百分比值
> prop.table(table(mtcars$cyl))*100
4 6 8
34.375 21.875 43.750
以上是一维数据,若是二维如何操作?
以vcd包中的Arthritis数据集为例
> library(vcd)
> head(Arthritis)
ID Treatment Sex Age Improved
1 57 Treated Male 27 Some
2 46 Treated Male 29 None
3 77 Treated Male 30 None
4 17 Treated Male 32 Marked
5 36 Treated Male 46 Marked
6 23 Treated Male 58 Marked
#treatment、sex、age、improved都可作为因子,取两个作为统计
#首先统计treatment和improved的频率
> table(Arthritis$Treatment,Arthritis$Improved)
None Some Marked
Placebo 29 7 7
Treated 13 7 21
#若变量太多,可先apply、with加载数据
> with(data = Arthritis,table(Treatment,Improved))
Improved
Treatment None Some Marked
Placebo 29 7 7
Treated 13 7 21
(3)xtabs
#formula参数可省略,
#x+x表示根据这两个参数进行计算,
> xtabs(~ Treatment+Improved,data = Arthritis)
Improved
Treatment None Some Marked
Placebo 29 7 7
Treated 13 7 21
- 计算编辑频数与比例
#将xtabs结果保存在x中
> x <- xtabs(~ Treatment+Improved,data = Arthritis)
#margin.table(),1或2
#1代表行,2代表列
> margin.table(x,1)
Treatment
Placebo Treated
43 41
> prop.table(x,1)
Improved
Treatment None Some Marked
Placebo 0.6744186 0.1627907 0.1627907
Treated 0.3170732 0.1707317 0.5121951
> margin.table(x,2)
Improved
None Some Marked
42 14 28
#addmargins()可直接将编辑的和添加到频数表中
> addmargins(mytable)
> addmargins(x,2)
Improved
Treatment None Some Marked Sum
Placebo 29 7 7 43
Treated 13 7 21 41
三维数据用ftable()