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、数据表(矩阵)排序
- 以R语言自带的鸢尾花(iris)数据集为例
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函数。
- arrange函数用法简单,格式为arrange(数据表名,变量名),如果是降序排列则可以arrange(数据表名,-变量名)或arrange(数据表名,desc(变量名))。
- 特别值得一提的是,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的方式中排序后的数据表的行号仍然使用原始数据表的行号。
二、筛选
-
which函数完成筛选工作
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
-
dplyr包的filter()函数完成筛选
> 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, ...)
- x 要进行划分的数据
- f 划分的依据,可以是list,表示按list中各变量的Level组合来划分
- drop 默认为FALSE,若为TRUE,当f为list时,各变量的Level组合为空时自动舍弃这一分组
# 第一种思路是使用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