美文网首页R语言学习
R语言学习笔记(15)-R函数(1)

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

作者: Akuooo | 来源:发表于2021-01-31 21:55 被阅读0次

    一、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)

        本文链接:https://www.haomeiwen.com/subject/elyqtltx.html