通常我们将EXCLE表格或者分隔符分割的文本文件导入R中进行处理,这些数据在R语言称为数据框也可以叫做数据集,数据框中的行、列也分别称为观测和变量。
应用于数据框的函数和R包有很多,目前对数据框处理速度比较快的两个R包是鼎鼎大名的dplyr
包和tidyr
包,这两个包最主要的三个作用分别是:
- 单个数据框的操作
- 两个数据框的操作
- 数据框的重塑
接下来我将通过三篇文章分别介绍这三类操作、首先介绍的是单个数据框的操作,若掌握了单个数据框的操作、基本上可以满足我们大部分关于数据框处理的需求,在介绍之前我想先回顾一下关于数据框处理的基础函数。
函数 | 功能 |
---|---|
rownames(mtcars) |
查看数据框mtcars 的行名 |
colnames(mtcars) |
查看数据框的列名 |
dim(mtcars) |
查看数据框的行数和列数 |
is.data.frame(mtcars) |
查看是否为数据框 |
as.data.frame(mtcars) |
转换为数据框 |
mtcars$cyl |
若变量cyl 在数据框mtcars 中,则提取这一列,若不在则可以添加新的变量 |
下面让我们正式进入数据框的世界!
1 按行操作
1. 1 过滤
dplyr
包中filter()
函数筛选满足条件的行
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
filter_iris = filter(iris, Sepal.Length > 7) # 选择Sepal.Length>7的行
head(filter_iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 7.1 3.0 5.9 2.1 virginica
## 2 7.6 3.0 6.6 2.1 virginica
## 3 7.3 2.9 6.3 1.8 virginica
## 4 7.2 3.6 6.1 2.5 virginica
## 5 7.7 3.8 6.7 2.2 virginica
## 6 7.7 2.6 6.9 2.3 virginica
filter()
函数可以进行的逻辑型操作(TRUE、FALSE)和布尔型操作(或、且、非):
操作 | 作用 |
---|---|
> 、< 、>= 、<= |
大于、小于、大于等于、小于等于 |
is.na() |
缺失值 |
!is.na() |
非缺失值 |
%in% |
存在 |
| |
或 |
& |
且 |
! |
非 |
limma包
中avereps()
函数对某列中相同元素所在的行取均值
library(limma)
avereps(mtcars, ID = mtcars$cyl) # 按'cyl'列取均值
## mpg cyl disp hp drat wt qsec vs
## 6 19.74286 6 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286
## 4 26.66364 4 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909
## 8 15.10000 8 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000
## am gear carb
## 6 0.4285714 3.857143 3.428571
## 4 0.7272727 4.090909 1.545455
## 8 0.1428571 3.285714 3.500000
1.2 排序
arrange()
函数按某列值的大小对数据集进行排序
升序
arrange_mpg = arrange(mtcars, mpg)
head(arrange_mpg)
## mpg cyl disp hp drat wt qsec vs am gear carb
## 1 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4
## 2 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4
## 3 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4
## 4 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
## 5 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
## 6 15.0 8 301 335 3.54 3.570 14.60 0 1 5 8
降序
desc_arrange_mpg = arrange(mtcars, desc(mpg))
head(desc_arrange_mpg)
## mpg cyl disp hp drat wt qsec vs am gear carb
## 1 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## 2 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## 3 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## 4 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## 5 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## 6 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
1.3 添加新行
add_row()
函数可以在指定的行前后添加新的一行
head(faithful)
## eruptions waiting
## 1 3.600 79
## 2 1.800 54
## 3 3.333 74
## 4 2.283 62
## 5 4.533 85
## 6 2.883 55
# 在第二行之前加上一行
df1 = add_row(faithful, .before = 2,eruptions = 1.1, waiting = 1.3)
head(df1)
## eruptions waiting
## 1 3.600 79.0
## 2 1.100 1.3
## 3 1.800 54.0
## 4 3.333 74.0
## 5 2.283 62.0
## 6 4.533 85.0
# 在第二行之后加上一行
df2 = add_row(faithful, .after = 2,eruptions = 2.22, waiting = 2.23)
head(df2)
## eruptions waiting
## 1 3.600 79.00
## 2 1.800 54.00
## 3 2.220 2.23
## 4 3.333 74.00
## 5 2.283 62.00
## 6 4.533 85.00
2 按列操作
2.1 过滤
用select()
函数对数据集按列进行筛选,但是select()
函数的功能在实际应用中并不多,基础函数就已经可以满足了,所以就简单记录一下,可能以后会用到。
示例数据
iris = iris[1:3,]
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
变量名筛选
select(iris, Sepal.Length, Sepal.Width)
## Sepal.Length Sepal.Width
## 1 5.1 3.5
## 2 4.9 3.0
## 3 4.7 3.2
选择变量名中以Petal
开头的变量
select(iris, starts_with("Petal"))
## Petal.Length Petal.Width
## 1 1.4 0.2
## 2 1.4 0.2
## 3 1.3 0.2
选择变量名中以Width
结尾的变量
select(iris, ends_with("Width"))
## Sepal.Width Petal.Width
## 1 3.5 0.2
## 2 3.0 0.2
## 3 3.2 0.2
更换变量所在位置
# 将变量Species放置在第一列
select(iris, Species, everything())
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 5.1 3.5 1.4 0.2
## 2 setosa 4.9 3.0 1.4 0.2
## 3 setosa 4.7 3.2 1.3 0.2
# 将变量Sepal.Length放置在最后一列
select(iris, -Sepal.Length, Sepal.Length)
## Sepal.Width Petal.Length Petal.Width Species Sepal.Length
## 1 3.5 1.4 0.2 setosa 5.1
## 2 3.0 1.4 0.2 setosa 4.9
## 3 3.2 1.3 0.2 setosa 4.7
选择两个变量之间所有的变量
select(iris,Sepal.Length:Petal.Length)
## Sepal.Length Sepal.Width Petal.Length
## 1 5.1 3.5 1.4
## 2 4.9 3.0 1.4
## 3 4.7 3.2 1.3
2.2 添加新列
示例数据
df = mtcars[1:4,1:4]
df
## mpg cyl disp hp
## Mazda RX4 21.0 6 160 110
## Mazda RX4 Wag 21.0 6 160 110
## Datsun 710 22.8 4 108 93
## Hornet 4 Drive 21.4 6 258 110
mutate()
函数可以增加新的变量,值得注意的一点是添加新变量之后行名发生了变化,所以也没有基础函数好用。
mutate(df,draft = c(3.90,3.90,3.85,3.08))
## mpg cyl disp hp draft
## 1 21.0 6 160 110 3.90
## 2 21.0 6 160 110 3.90
## 3 22.8 4 108 93 3.85
## 4 21.4 6 258 110 3.08
对已有变量进行运算,运算结果直接添加为新的变量
mutate(df, gpm = 1/mpg)
## mpg cyl disp hp gpm
## 1 21.0 6 160 110 0.04761905
## 2 21.0 6 160 110 0.04761905
## 3 22.8 4 108 93 0.04385965
## 4 21.4 6 258 110 0.04672897
2.3 变量重命名
rename(df,mpg1 = mpg)
## mpg1 cyl disp hp
## Mazda RX4 21.0 6 160 110
## Mazda RX4 Wag 21.0 6 160 110
## Datsun 710 22.8 4 108 93
## Hornet 4 Drive 21.4 6 258 110
3 管道操作
dplyr
包还有一个强大的功能是通过管道操作符%>%
进行管道操作,所谓管道操作就是让上一个处理的结果作为下一个处理的输入,这样可以减少变量(赋值对象)的命名,提高数据处理的效率,下面以一个例子来解释什么是管道操作。
filter(mtcars,cyl == 6) %>% arrange(mpg) %>% select(cyl,mpg)
## cyl mpg
## 1 6 17.8
## 2 6 18.1
## 3 6 19.2
## 4 6 19.7
## 5 6 21.0
## 6 6 21.0
## 7 6 21.4