R语言

R语言笔记Day1(排序、筛选以及分类汇总))

2020-01-16  本文已影响0人  养猪场小老板

一、排序
1、单变量序列排序
2、数据表(矩阵)排序
二、筛选
三、分类汇总

一、排序

1、单变量序列排序

rank、sort和order函数

> a <- c(3, 1, 5)
> a
[1] 3 1 5
#rank用来计算序列中每个元素的秩
#这里的“秩”可以理解为该元素在序列中由小到大排列的次序
#上面例子给出的序列[3, 1, 5]中,1最小,5最大,3居中
#于是1的秩为1,3的秩为2,5的秩为3,(3, 1, 5)对应的秩的结果就是(2,1, 3)
> rank(a)
[1] 2 1 3
#sort函数给出的是排序后的结果
> sort(a)
[1] 1 3 5
#而order函数给出的是排序后的序列中各元素在原始序列中的位置“第几”
> order(a)
[1] 2 1 3
参数 意义
x 要进行排序的序列
na.last 表示对缺失值的处理办法 若为TRUE则将缺失值排在最后,若为FALSE则排在最前;若为NA则排序时先将缺失值剔除;
ties.method 表示对序列有“结”(即序列中存在相同的元素)时的处理方法, 可以有"average","first", "last", "random", "max","min"等选择;
decreasing 默认为FALSE表示按升序排列,若为TRUE则按降序排列;
method 表示排序使用的算法,可以有"auto","shell", "radix"等选择。

2、数据表(矩阵)排序

1. 使用order函数进行排序
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> order(iris[1])
  [1]  14   9  39  43  42   4   7  23  48   3  30  12  13  25  31  46
 [17]   2  10  35  38  58 107   5   8  26  27  36  41  44  50  61  94
 [33]   1  18  20  22  24  40  45  47  99  28  29  33  60  49   6  11
 [49]  17  21  32  85  34  37  54  81  82  90  91  65  67  70  89  95
 [65] 122  16  19  56  80  96  97 100 114  15  68  83  93 102 115 143
 [81]  62  71 150  63  79  84  86 120 139  64  72  74  92 128 135  69
 [97]  98 127 149  57  73  88 101 104 124 134 137 147  52  75 112 116
[113] 129 133 138  55 105 111 117 148  59  76  66  78  87 109 125 141
[129] 145 146  77 113 144  53 121 140 142  51 103 110 126 130 108 131
[145] 106 118 119 123 136 132
> iris[(order(iris[1])), ]#默认是升序
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
14           4.3         3.0          1.1         0.1     setosa
9            4.4         2.9          1.4         0.2     setosa
39           4.4         3.0          1.3         0.2     setosa
43           4.4         3.2          1.3         0.2     setosa
42           4.5         2.3          1.3         0.3     setosa
4            4.6         3.1          1.5         0.2     setosa
......
> iris[(order(iris[1],decreasing = T)), ]#降序
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
132          7.9         3.8          6.4         2.0  virginica
118          7.7         3.8          6.7         2.2  virginica
119          7.7         2.6          6.9         2.3  virginica
123          7.7         2.8          6.7         2.0  virginica
136          7.7         3.0          6.1         2.3  virginica
106          7.6         3.0          6.6         2.1  virginica
......
2. 使用arrange函数进行排序

dplyr包的arrange函数。

  1. arrange函数用法简单,格式为arrange(数据表名,变量名),如果是降序排列则可以arrange(数据表名,-变量名)或arrange(数据表名,desc(变量名))。
  2. 特别值得一提的是,arrange函数还有arrange(数据表名,变量名1,变量名2,...)这种形式的用法,表示如果数据在“变量1”的值相同时按照“变量2”排序。
>library(dplyr)
> arrange(iris, Sepal.Width)## Sepal.Width默认升序
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.0         2.0          3.5         1.0 versicolor
2            6.0         2.2          4.0         1.0 versicolor
3            6.2         2.2          4.5         1.5 versicolor
4            6.0         2.2          5.0         1.5  virginica
5            4.5         2.3          1.3         0.3     setosa
6            5.5         2.3          4.0         1.3 versicolor
......
## Sepal.Width降序
> arrange(iris, desc(Sepal.Width))
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.7         4.4          1.5         0.4     setosa
2            5.5         4.2          1.4         0.2     setosa
3            5.2         4.1          1.5         0.1     setosa
4            5.8         4.0          1.2         0.2     setosa
5            5.4         3.9          1.7         0.4     setosa
6            5.4         3.9          1.3         0.4     setosa
......
> ## Sepal.Width升序,当Sepal.Width相同时按Petal.Length降序
> arrange(iris, Sepal.Width,-Petal.Length)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.0         2.0          3.5         1.0 versicolor
2            6.0         2.2          5.0         1.5  virginica
3            6.2         2.2          4.5         1.5 versicolor
4            6.0         2.2          4.0         1.0 versicolor
5            6.3         2.3          4.4         1.3 versicolor
6            5.5         2.3          4.0         1.3 versicolor
#使用arrange进行排序后,数据表的行号重新从1开始排列了;
#而使用order的方式中排序后的数据表的行号仍然使用原始数据表的行号。

二、筛选

1、挑选出iris数据集中Sepal.Width为2的数据:

> iris[which(iris$Sepal.Width==2), ]
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
61            5           2          3.5           1 versicolor

2、挑选出iris数据集中Sepal.Width大于4的数据:

> iris[which(iris$Sepal.Width > 4), ]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
16          5.7         4.4          1.5         0.4  setosa
33          5.2         4.1          1.5         0.1  setosa
34          5.5         4.2          1.4         0.2  setosa

3、挑选出iris数据集中Species为setosa的数据:

> iris[which(iris$Species== 'setosa'), ]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa

4、如果挑选Species为setosa或virginica的数据呢,当然我们可以用“或”的运算符“|”来构建:

> iris[which((iris$Species== 'setosa') | (iris$Species == 'virginica')), ]
> iris[which(iris$Species== 'setosa'| iris$Species == 'virginica'), ]
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1            5.1         3.5          1.4         0.2    setosa
2            4.9         3.0          1.4         0.2    setosa
3            4.7         3.2          1.3         0.2    setosa
4            4.6         3.1          1.5         0.2    setosa
5            5.0         3.6          1.4         0.2    setosa
6            5.4         3.9          1.7         0.4    setosa
......
介绍x%in%table操作符,match()函数的缩写;
%in% 返回一个逻辑向量,表示左边的操作符是否匹配右边的操作符。
如果x元素能够匹配到table元素,那么相应位置的元素值是TRUE,否则,元素值是FALSE。
a %in% b 将生成一个与a长度相同的logical序列,依次判断a中的元素是否被包含在b中。
先举例说明
> a <- c(1,2,3,4,5,6,7,8)
> b <- c(2,4,6,8,10)
> a%in%b
[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
a中有多少个元素,返回多少个逻辑值
> iris[which(iris$Species%in% c('setosa', 'virginica')), ]
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1            5.1         3.5          1.4         0.2    setosa
2            4.9         3.0          1.4         0.2    setosa
3            4.7         3.2          1.3         0.2    setosa
4            4.6         3.1          1.5         0.2    setosa
5            5.0         3.6          1.4         0.2    setosa
6            5.4         3.9          1.7         0.4    setosa
7            4.6         3.4          1.4         0.3    setosa
> filter(iris,Sepal.Width == 2)
> filter(iris,Sepal.Width > 4)
> filter(iris,Species == 'setosa')
> filter(iris,Species %in% c('setosa', 'virginica'))

三、分类汇总

1、对iris数据集进行分类汇总,比方说计算不同Species中Sepal.Width的平均值

split(x, f,drop = FALSE, ...)
# 第一种思路是使用split函数和sapply函数
#首先将序列Sepal.Width按照Species划分成子集,然后对每个子集求平均:
> a <- split(iris$Sepal.Width, iris$Species)
> a
$setosa
 [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4
[17] 3.9 3.5 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4
[33] 4.1 4.2 3.1 3.2 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2
[49] 3.7 3.3

$versicolor
 [1] 3.2 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1
[17] 3.0 2.7 2.2 2.5 3.2 2.8 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4
[33] 2.7 2.7 3.0 3.4 3.1 2.3 3.0 2.5 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9
[49] 2.5 2.8

$virginica
 [1] 3.3 2.7 3.0 2.9 3.0 3.0 2.5 2.9 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2
[17] 3.0 3.8 2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3.0 2.8 3.0 2.8 3.8
[33] 2.8 2.8 2.6 3.0 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2 3.3 3.0 2.5 3.0
[49] 3.4 3.0
> sapply(a, mean)
    setosa versicolor  virginica 
     3.428      2.770      2.974 
#第二种思路是使用aggregate函数:
> aggregate(x = iris$Sepal.Width, by= list(iris$Species), FUN = mean)
    Group.1     x
1    setosa 3.428
2 versicolor 2.770
3 virginica 2.974
> aggregate(x = iris[, 1:2], by =list(iris$Species), FUN = mean)
    Group.1 Sepal.Length Sepal.Width
1    setosa        5.006       3.428
2 versicolor        5.936       2.770
3 virginica        6.588       2.974
上一篇下一篇

猜你喜欢

热点阅读