R语言学习笔记(15)-R函数(1)

一、R函数

  1. 类似Linux中的命令,每个命令有特定功能。
  2. 困难之处也在于函数的数量多


    R函数.png
  3. 函数必须加括号
  4. 返回值
    一般函数都有返回值,但这个返回值是多种多样的
    (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)产生相同分布的随机数


normal

(2)离散函数


image.png
  1. 作用:需要知道每一种分布涉及到的函数,能够使用对应的函数;如果检测对应数据集,是否满足以上某种分布,如,给一个调查问卷的数据,分析其是否满足正态分布、t分布、卡方分布等,能够对其进行检验。

  2. 生成随机数
    (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
  1. 问题
    每次生成的随机数会不一致,若想生成同样的随机数,可通过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

四、描述性统计函数

  1. summary()
    运行一次,就可以对数据进行详细统计,可提供最小值、最大值、四分位数和数值型变量的均值,以及因子向量、逻辑向量 数统计
  2. fivenum()
    与summary类似,可以返回五个基本统计量(最小值、四分位数、中位数、下四分位数、最大值)
  3. hmisc包
    describe()函数计算统计量,返回观测的数量、缺失值和唯一值的数目以及平均值,分位数,以及5个最大值和5个最小值
  4. pastecs包
    stat.desc()函数可以计算种类繁多的描述性统一量,其中s是一个数据框或是时间序列
  5. psych包
    describe()函数可以计算非缺失值数量,平均数、标准差、中位数、结尾的均值、最大值、最小值、偏度等。
    它还包括一个结尾均值(去掉两头的部分),可通过设置trim参数(trim= 0.1,去除最低和最高10%的部分)。
    其实hmisc中也有describe函数,一般来说都是默认以后面载入的那个包为主。
    若想使用前面载入的包的describe函数,可以通过使用在包的名字后面加两个冒号,然后接函数的名字。
> Hmisc::describe(mtcars)
  1. 分组描述
    可使用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. 分组计算
    (1)doBy包
    summaryBy()
    使用了符号,左侧是需要分析的数值型变量,写数据框列的名字就行,需要添加引号,不同变量之间用+表示,然后是;右侧是类别型分组变量。
    然后是data参数指定数据集(接一个数据框)
    FUN参数,指定函数,可以是内置函数或者是自定义函数(接一个函数)
    这样就一次能完成多个分组、平均值的计算,结果展现在一个表格内。
    (2)psych包
    describe.by()函数,能够计算相同统一量,by指可通过分组来计算。只需要添加一个需要分组的列表,直接给定一个list即可,结果就会输出很多统计值
    优点:适合详细查看每个分组的统计值
    缺点:统计值是固定不变的,无法使用自定义的函数

五、频数统计函数

  1. 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. 频数统计
    (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


xtabs
#formula参数可省略,
#x+x表示根据这两个参数进行计算,
> xtabs(~ Treatment+Improved,data = Arthritis)
         Improved
Treatment None Some Marked
  Placebo   29    7      7
  Treated   13    7     21
  1. 计算编辑频数与比例
#将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()

你可能感兴趣的:(R语言学习笔记(15)-R函数(1))