R-基础(四):数据框-单表操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43700050/article/details/102689953

通常我们将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

猜你喜欢

转载自blog.csdn.net/weixin_43700050/article/details/102689953