第 2 章 数据清洗

在我们了解了如何创建和导入数据以后,接下来就到了比较关键的环节,数据清洗,当我们导入数据以后,很多时候数据的格式和内容不太符合我们的要求,因此就需要进行数据整理,以便我们对数据有个清晰的了解和方便后面模型构建。这里我们用我们1.4创建的数据进行操作,简单给大家讲一些常见的数据处理方法。关于数据整理有两个安装包非常值得推荐给大家,那就是 dplyrtidyverse, 其中 tidyverse 是整合了多个数据处理安装包于一体的安装包,加载这个安装包,那基本的数据处理包和绘图包都会自动加载,这样就节省了一一调用其他个别安装包的麻烦,但有时也会造成代码重叠问题,因为有些程序代码是同时出现在两个或者多个安装包内,但可能会有所不同,因此要视情况而定。

2.1 数据描述

2.1.1 描述统计

当我们得到数据以后,我们需要先了解一下数据的结构,以方便我们对数据做进一步处理,我们先调用R base 自带的 strsummary 程序来查看一下数据的类型,以及各类型的具体内容。

str(growth)
## 'data.frame':    75 obs. of  5 variables:
##  $ site      : chr  "site1" "site1" "site1" "site1" ...
##  $ families  : chr  "f1" "f1" "f1" "f1" ...
##  $ dbh       : num  10.5 10.5 11.5 20.5 17.5 16.5 16.5 16.5 15.5 20.5 ...
##  $ height    : num  26.8 13.8 12.8 22.8 24.8 20.8 23.8 13.8 17.8 30.8 ...
##  $ zhi_height: num  12.1 15.1 10.1 10.1 12.1 10.1 11.1 12.1 15.1 12.1 ...
summary(growth)
##      site             families              dbh            height     
##  Length:75          Length:75          Min.   :10.50   Min.   :10.80  
##  Class :character   Class :character   1st Qu.:12.50   1st Qu.:15.80  
##  Mode  :character   Mode  :character   Median :14.50   Median :21.80  
##                                        Mean   :14.77   Mean   :21.57  
##                                        3rd Qu.:17.00   3rd Qu.:26.80  
##                                        Max.   :20.50   Max.   :30.80  
##    zhi_height   
##  Min.   :10.10  
##  1st Qu.:11.10  
##  Median :12.10  
##  Mean   :12.55  
##  3rd Qu.:14.10  
##  Max.   :15.10

可以看出,str可以清楚的显示我们数据的包括的内容,以及各个类型的数据形式,是 factor还是num,或者其他类型。而summary可以得到各个数据类型的统计信息。非常方便我们进行下一步处理。如果我们想查看数据的每一列的名字,我们可以使用 names,这样我们就可以知道我们的数据有几个变量。

names(growth)
## [1] "site"       "families"   "dbh"        "height"     "zhi_height"

2.1.2 数据纬度

在R里面,数据可以一般可以分为一维、二维和三维数据,在光谱数据中,一般为二维数据,而高光谱数据则为三维数据,包含更多信息。

#一维数据
a <- c(1,2,3,4,5)
b <- c(2,3,4,5,6)
str(b)
##  num [1:5] 2 3 4 5 6
##二维数据    
ab <- cbind(a,b)
dim(ab) 
## [1] 5 2
## 三维数据
library(reticulate)
ab_array <- array_reshape(ab, c(5, 2,1))
dim(ab_array)
## [1] 5 2 1

我们将在后面高光谱数据建模时经常用到三维数据。

2.2 数据整理

dplyr是一个非常实用并且运算速度很快的数据整理安装包,接下来我们通过示例来介绍一下这个安装包的一些主要的功能。

2.2.1 添加变量

如果我们想在原有的数据上增加一列,我们可以使用dplyr中的 mutate程序。比如我们想在这个生长数据中添加N含量的数据,示例如下:

library(dplyr)
growth <-  mutate(growth, n_con =sample(x = 10.8:30.8, size  = 75, replace = TRUE) )
head(growth)
##    site families  dbh height zhi_height n_con
## 1 site1       f1 10.5   26.8       12.1  15.8
## 2 site1       f1 10.5   13.8       15.1  28.8
## 3 site1       f1 11.5   12.8       10.1  17.8
## 4 site1       f1 20.5   22.8       10.1  24.8
## 5 site1       f1 17.5   24.8       12.1  23.8
## 6 site1       f2 16.5   20.8       10.1  29.8

可以看到,我们的N数据已经成功添加。

2.2.2 去除变量

去除单个变量

#比如去除dbh这个变量
library(tidyverse)
gro <- growth %>% select(-dbh)
head(gro)
##    site families height zhi_height n_con
## 1 site1       f1   26.8       12.1  15.8
## 2 site1       f1   13.8       15.1  28.8
## 3 site1       f1   12.8       10.1  17.8
## 4 site1       f1   22.8       10.1  24.8
## 5 site1       f1   24.8       12.1  23.8
## 6 site1       f2   20.8       10.1  29.8

去除多个变量

#比如去除dbh,height这两个变量
library(tidyverse)
gro1 <- growth %>% select(-c(dbh,height))
head(gro1)
##    site families zhi_height n_con
## 1 site1       f1       12.1  15.8
## 2 site1       f1       15.1  28.8
## 3 site1       f1       10.1  17.8
## 4 site1       f1       10.1  24.8
## 5 site1       f1       12.1  23.8
## 6 site1       f2       10.1  29.8

2.2.3 统计分析

growth %>% summarise( mean = mean (dbh),
                                      max = max(dbh),
                                      min = min(dbh),
                                      sd = sd(dbh),
                                      cv= sd/mean
                                      )
##       mean  max  min       sd        cv
## 1 14.76667 20.5 10.5 2.946979 0.1995697

2.2.4 选择变量

#选择单个变量
growth1 <- growth %>% select(dbh)
head(growth1)
##    dbh
## 1 10.5
## 2 10.5
## 3 11.5
## 4 20.5
## 5 17.5
## 6 16.5
#选择多个变量
growth1 <- growth %>% select(dbh,n_con)
head(growth1)
##    dbh n_con
## 1 10.5  15.8
## 2 10.5  28.8
## 3 11.5  17.8
## 4 20.5  24.8
## 5 17.5  23.8
## 6 16.5  29.8

2.2.5 选择变量统计分析


growth %>% select(dbh) %>% summarise( mean = mean (dbh),
                                      max = max(dbh),
                                      min = min(dbh),
                                      sd = sd(dbh),
                                      cv= sd/mean
                                      )
##       mean  max  min       sd        cv
## 1 14.76667 20.5 10.5 2.946979 0.1995697

2.2.6 分组查看选定变量

我们也可以根据不同的分组来进行选择和统计分析,例如:

单个分组

比如我们选择以地点为基础的计算不同地点的dbh的统计信息。

head(growth %>% group_by(site)%>% select(dbh))
## # A tibble: 6 x 2
## # Groups:   site [1]
##   site    dbh
##   <chr> <dbl>
## 1 site1  10.5
## 2 site1  10.5
## 3 site1  11.5
## 4 site1  20.5
## 5 site1  17.5
## 6 site1  16.5
growth %>% group_by(site)%>% select(dbh) %>% summarise( mean = mean (dbh),
                                      max = max(dbh),
                                      min = min(dbh),
                                      sd = sd(dbh),
                                      cv= sd/mean
                                      )
## # A tibble: 3 x 6
##   site   mean   max   min    sd    cv
## * <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 site1  14.7  20.5  10.5  3.34 0.228
## 2 site2  15.3  20.5  11.5  2.67 0.174
## 3 site3  14.3  20.5  10.5  2.81 0.197

2.2.6.1 多个分组

我们选择对不同地点,不同家系中dbh进行统计信息。

growth %>% group_by(families,site) %>% 
  select(dbh) %>% 
  summarise( mean = mean (dbh),
  max = max(dbh),
  min = min(dbh),
  sd = sd(dbh),
  cv= sd/mean )
## # A tibble: 15 x 7
## # Groups:   families [5]
##    families site   mean   max   min    sd     cv
##    <chr>    <chr> <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1 f1       site1  14.1  20.5  10.5  4.62 0.327 
##  2 f1       site2  15.1  17.5  12.5  2.30 0.152 
##  3 f1       site3  14.5  16.5  12.5  1.41 0.0975
##  4 f2       site1  17.1  20.5  15.5  1.95 0.114 
##  5 f2       site2  17.9  20.5  14.5  2.30 0.129 
##  6 f2       site3  14.1  20.5  11.5  3.65 0.259 
##  7 f3       site1  12.7  16.5  10.5  2.39 0.188 
##  8 f3       site2  15.9  18.5  12.5  2.61 0.164 
##  9 f3       site3  13.1  15.5  10.5  1.95 0.149 
## 10 f4       site1  14.3  17.5  10.5  3.11 0.218 
## 11 f4       site2  12.7  14.5  11.5  1.30 0.103 
## 12 f4       site3  15.3  20.5  11.5  3.96 0.259 
## 13 f5       site1  15.1  20.5  10.5  3.65 0.242 
## 14 f5       site2  15.1  17.5  11.5  2.51 0.166 
## 15 f5       site3  14.5  17.5  10.5  3.08 0.213

2.2.7 筛选变量

我们可以根据特定条件进行数据查看与统计分析,比如我们想知道15 < dbh < 16 的数据有多少:

library(tidyverse)
growth %>% filter( dbh >15 & dbh <16)
##    site families  dbh height zhi_height n_con
## 1 site1       f2 15.5   17.8       15.1  15.8
## 2 site1       f4 15.5   21.8       15.1  10.8
## 3 site1       f5 15.5   19.8       14.1  12.8
## 4 site1       f5 15.5   26.8       15.1  23.8
## 5 site2       f3 15.5   28.8       13.1  15.8
## 6 site3       f3 15.5   17.8       14.1  29.8

在第一个地点里 dbh<15的数据有多少:

library(tidyverse)
growth %>% filter( dbh < 15 & site == 'site1')
##     site families  dbh height zhi_height n_con
## 1  site1       f1 10.5   26.8       12.1  15.8
## 2  site1       f1 10.5   13.8       15.1  28.8
## 3  site1       f1 11.5   12.8       10.1  17.8
## 4  site1       f3 13.5   13.8       15.1  22.8
## 5  site1       f3 11.5   20.8       15.1  30.8
## 6  site1       f3 10.5   21.8       10.1  30.8
## 7  site1       f3 11.5   24.8       13.1  30.8
## 8  site1       f4 10.5   26.8       10.1  27.8
## 9  site1       f4 11.5   13.8       14.1  27.8
## 10 site1       f5 13.5   17.8       15.1  16.8
## 11 site1       f5 10.5   25.8       11.1  20.8

除了第一个地点,其他地点dbh<15的数据有多少,这里要用到!,表示否定的意思:

library(tidyverse)
growth %>% filter( dbh < 15 & !site == 'site1')
##     site families  dbh height zhi_height n_con
## 1  site2       f1 14.5   15.8       12.1  22.8
## 2  site2       f1 12.5   29.8       12.1  19.8
## 3  site2       f1 13.5   14.8       11.1  11.8
## 4  site2       f2 14.5   12.8       12.1  27.8
## 5  site2       f3 12.5   23.8       10.1  27.8
## 6  site2       f3 14.5   27.8       15.1  14.8
## 7  site2       f4 11.5   11.8       14.1  23.8
## 8  site2       f4 11.5   30.8       14.1  25.8
## 9  site2       f4 12.5   11.8       15.1  17.8
## 10 site2       f4 14.5   25.8       13.1  29.8
## 11 site2       f4 13.5   25.8       12.1  10.8
## 12 site2       f5 11.5   20.8       13.1  23.8
## 13 site2       f5 13.5   15.8       11.1  26.8
## 14 site3       f1 14.5   13.8       10.1  17.8
## 15 site3       f1 14.5   11.8       12.1  20.8
## 16 site3       f1 12.5   10.8       13.1  26.8
## 17 site3       f1 14.5   25.8       11.1  26.8
## 18 site3       f2 12.5   23.8       10.1  17.8
## 19 site3       f2 11.5   19.8       13.1  11.8
## 20 site3       f2 12.5   12.8       12.1  12.8
## 21 site3       f2 13.5   14.8       13.1  23.8
## 22 site3       f3 14.5   29.8       11.1  16.8
## 23 site3       f3 12.5   30.8       12.1  14.8
## 24 site3       f3 10.5   28.8       13.1  10.8
## 25 site3       f3 12.5   26.8       11.1  16.8
## 26 site3       f4 12.5   28.8       10.1  17.8
## 27 site3       f4 11.5   25.8       10.1  15.8
## 28 site3       f4 13.5   27.8       12.1  19.8
## 29 site3       f5 10.5   15.8       12.1  17.8
## 30 site3       f5 12.5   21.8       10.1  26.8
## 31 site3       f5 14.5   23.8       13.1  24.8

dbh = 15.5 的数据有多少,这里要用到“==”:

library(tidyverse)
growth %>% filter( dbh == 15.5)
##    site families  dbh height zhi_height n_con
## 1 site1       f2 15.5   17.8       15.1  15.8
## 2 site1       f4 15.5   21.8       15.1  10.8
## 3 site1       f5 15.5   19.8       14.1  12.8
## 4 site1       f5 15.5   26.8       15.1  23.8
## 5 site2       f3 15.5   28.8       13.1  15.8
## 6 site3       f3 15.5   17.8       14.1  29.8

2.2.8 重新排列

我们可以根据特定分组进行数据重新排序。 比如我们根据树高进行整体数据 升序排列:

growth %>% arrange( height)
##     site families  dbh height zhi_height n_con
## 1  site3       f1 12.5   10.8       13.1  26.8
## 2  site3       f4 20.5   10.8       12.1  13.8
## 3  site2       f4 11.5   11.8       14.1  23.8
## 4  site2       f4 12.5   11.8       15.1  17.8
## 5  site3       f1 14.5   11.8       12.1  20.8
## 6  site1       f1 11.5   12.8       10.1  17.8
## 7  site2       f2 14.5   12.8       12.1  27.8
## 8  site2       f5 17.5   12.8       12.1  16.8
## 9  site3       f2 12.5   12.8       12.1  12.8
## 10 site1       f1 10.5   13.8       15.1  28.8
## 11 site1       f2 16.5   13.8       12.1  16.8
## 12 site1       f3 13.5   13.8       15.1  22.8
## 13 site1       f4 11.5   13.8       14.1  27.8
## 14 site3       f1 14.5   13.8       10.1  17.8
## 15 site2       f1 13.5   14.8       11.1  11.8
## 16 site2       f5 16.5   14.8       15.1  19.8
## 17 site3       f2 13.5   14.8       13.1  23.8
## 18 site3       f5 17.5   14.8       10.1  16.8
## 19 site2       f1 14.5   15.8       12.1  22.8
## 20 site2       f5 13.5   15.8       11.1  26.8
## 21 site3       f5 10.5   15.8       12.1  17.8
## 22 site1       f2 15.5   17.8       15.1  15.8
## 23 site1       f3 16.5   17.8       15.1  13.8
## 24 site1       f4 16.5   17.8       15.1  20.8
## 25 site1       f5 13.5   17.8       15.1  16.8
## 26 site2       f5 16.5   17.8       14.1  14.8
## 27 site3       f3 15.5   17.8       14.1  29.8
## 28 site1       f5 15.5   19.8       14.1  12.8
## 29 site2       f3 18.5   19.8       11.1  16.8
## 30 site3       f2 11.5   19.8       13.1  11.8
## 31 site1       f2 16.5   20.8       10.1  29.8
## 32 site1       f3 11.5   20.8       15.1  30.8
## 33 site2       f5 11.5   20.8       13.1  23.8
## 34 site1       f3 10.5   21.8       10.1  30.8
## 35 site1       f4 15.5   21.8       15.1  10.8
## 36 site1       f5 20.5   21.8       15.1  15.8
## 37 site2       f2 20.5   21.8       14.1  22.8
## 38 site3       f5 12.5   21.8       10.1  26.8
## 39 site1       f1 20.5   22.8       10.1  24.8
## 40 site1       f2 16.5   23.8       11.1  24.8
## 41 site2       f3 12.5   23.8       10.1  27.8
## 42 site2       f3 18.5   23.8       15.1  15.8
## 43 site3       f2 12.5   23.8       10.1  17.8
## 44 site3       f2 20.5   23.8       12.1  11.8
## 45 site3       f5 14.5   23.8       13.1  24.8
## 46 site1       f1 17.5   24.8       12.1  23.8
## 47 site1       f3 11.5   24.8       13.1  30.8
## 48 site3       f1 16.5   24.8       11.1  26.8
## 49 site1       f5 10.5   25.8       11.1  20.8
## 50 site2       f2 17.5   25.8       10.1  12.8
## 51 site2       f4 14.5   25.8       13.1  29.8
## 52 site2       f4 13.5   25.8       12.1  10.8
## 53 site3       f1 14.5   25.8       11.1  26.8
## 54 site3       f4 18.5   25.8       12.1  24.8
## 55 site3       f4 11.5   25.8       10.1  15.8
## 56 site1       f1 10.5   26.8       12.1  15.8
## 57 site1       f4 10.5   26.8       10.1  27.8
## 58 site1       f5 15.5   26.8       15.1  23.8
## 59 site2       f2 17.5   26.8       11.1  16.8
## 60 site3       f3 12.5   26.8       11.1  16.8
## 61 site2       f3 14.5   27.8       15.1  14.8
## 62 site3       f4 13.5   27.8       12.1  19.8
## 63 site3       f5 17.5   27.8       13.1  24.8
## 64 site2       f1 17.5   28.8       15.1  19.8
## 65 site2       f3 15.5   28.8       13.1  15.8
## 66 site3       f3 10.5   28.8       13.1  10.8
## 67 site3       f4 12.5   28.8       10.1  17.8
## 68 site2       f1 12.5   29.8       12.1  19.8
## 69 site2       f2 19.5   29.8       10.1  26.8
## 70 site3       f3 14.5   29.8       11.1  16.8
## 71 site1       f2 20.5   30.8       12.1  26.8
## 72 site1       f4 17.5   30.8       14.1  29.8
## 73 site2       f1 17.5   30.8       13.1  16.8
## 74 site2       f4 11.5   30.8       14.1  25.8
## 75 site3       f3 12.5   30.8       12.1  14.8

降序排列:

growth %>% arrange( desc (height))
##     site families  dbh height zhi_height n_con
## 1  site1       f2 20.5   30.8       12.1  26.8
## 2  site1       f4 17.5   30.8       14.1  29.8
## 3  site2       f1 17.5   30.8       13.1  16.8
## 4  site2       f4 11.5   30.8       14.1  25.8
## 5  site3       f3 12.5   30.8       12.1  14.8
## 6  site2       f1 12.5   29.8       12.1  19.8
## 7  site2       f2 19.5   29.8       10.1  26.8
## 8  site3       f3 14.5   29.8       11.1  16.8
## 9  site2       f1 17.5   28.8       15.1  19.8
## 10 site2       f3 15.5   28.8       13.1  15.8
## 11 site3       f3 10.5   28.8       13.1  10.8
## 12 site3       f4 12.5   28.8       10.1  17.8
## 13 site2       f3 14.5   27.8       15.1  14.8
## 14 site3       f4 13.5   27.8       12.1  19.8
## 15 site3       f5 17.5   27.8       13.1  24.8
## 16 site1       f1 10.5   26.8       12.1  15.8
## 17 site1       f4 10.5   26.8       10.1  27.8
## 18 site1       f5 15.5   26.8       15.1  23.8
## 19 site2       f2 17.5   26.8       11.1  16.8
## 20 site3       f3 12.5   26.8       11.1  16.8
## 21 site1       f5 10.5   25.8       11.1  20.8
## 22 site2       f2 17.5   25.8       10.1  12.8
## 23 site2       f4 14.5   25.8       13.1  29.8
## 24 site2       f4 13.5   25.8       12.1  10.8
## 25 site3       f1 14.5   25.8       11.1  26.8
## 26 site3       f4 18.5   25.8       12.1  24.8
## 27 site3       f4 11.5   25.8       10.1  15.8
## 28 site1       f1 17.5   24.8       12.1  23.8
## 29 site1       f3 11.5   24.8       13.1  30.8
## 30 site3       f1 16.5   24.8       11.1  26.8
## 31 site1       f2 16.5   23.8       11.1  24.8
## 32 site2       f3 12.5   23.8       10.1  27.8
## 33 site2       f3 18.5   23.8       15.1  15.8
## 34 site3       f2 12.5   23.8       10.1  17.8
## 35 site3       f2 20.5   23.8       12.1  11.8
## 36 site3       f5 14.5   23.8       13.1  24.8
## 37 site1       f1 20.5   22.8       10.1  24.8
## 38 site1       f3 10.5   21.8       10.1  30.8
## 39 site1       f4 15.5   21.8       15.1  10.8
## 40 site1       f5 20.5   21.8       15.1  15.8
## 41 site2       f2 20.5   21.8       14.1  22.8
## 42 site3       f5 12.5   21.8       10.1  26.8
## 43 site1       f2 16.5   20.8       10.1  29.8
## 44 site1       f3 11.5   20.8       15.1  30.8
## 45 site2       f5 11.5   20.8       13.1  23.8
## 46 site1       f5 15.5   19.8       14.1  12.8
## 47 site2       f3 18.5   19.8       11.1  16.8
## 48 site3       f2 11.5   19.8       13.1  11.8
## 49 site1       f2 15.5   17.8       15.1  15.8
## 50 site1       f3 16.5   17.8       15.1  13.8
## 51 site1       f4 16.5   17.8       15.1  20.8
## 52 site1       f5 13.5   17.8       15.1  16.8
## 53 site2       f5 16.5   17.8       14.1  14.8
## 54 site3       f3 15.5   17.8       14.1  29.8
## 55 site2       f1 14.5   15.8       12.1  22.8
## 56 site2       f5 13.5   15.8       11.1  26.8
## 57 site3       f5 10.5   15.8       12.1  17.8
## 58 site2       f1 13.5   14.8       11.1  11.8
## 59 site2       f5 16.5   14.8       15.1  19.8
## 60 site3       f2 13.5   14.8       13.1  23.8
## 61 site3       f5 17.5   14.8       10.1  16.8
## 62 site1       f1 10.5   13.8       15.1  28.8
## 63 site1       f2 16.5   13.8       12.1  16.8
## 64 site1       f3 13.5   13.8       15.1  22.8
## 65 site1       f4 11.5   13.8       14.1  27.8
## 66 site3       f1 14.5   13.8       10.1  17.8
## 67 site1       f1 11.5   12.8       10.1  17.8
## 68 site2       f2 14.5   12.8       12.1  27.8
## 69 site2       f5 17.5   12.8       12.1  16.8
## 70 site3       f2 12.5   12.8       12.1  12.8
## 71 site2       f4 11.5   11.8       14.1  23.8
## 72 site2       f4 12.5   11.8       15.1  17.8
## 73 site3       f1 14.5   11.8       12.1  20.8
## 74 site3       f1 12.5   10.8       13.1  26.8
## 75 site3       f4 20.5   10.8       12.1  13.8

2.2.9 重命名数据变量

我们可以根据需要对数据各个变量重新命名,比如我想把树高名字height 变成hei,胸径的名字dbh 变成DBH:

growth %>% rename(hei = height,DBH = dbh )
##     site families  DBH  hei zhi_height n_con
## 1  site1       f1 10.5 26.8       12.1  15.8
## 2  site1       f1 10.5 13.8       15.1  28.8
## 3  site1       f1 11.5 12.8       10.1  17.8
## 4  site1       f1 20.5 22.8       10.1  24.8
## 5  site1       f1 17.5 24.8       12.1  23.8
## 6  site1       f2 16.5 20.8       10.1  29.8
## 7  site1       f2 16.5 23.8       11.1  24.8
## 8  site1       f2 16.5 13.8       12.1  16.8
## 9  site1       f2 15.5 17.8       15.1  15.8
## 10 site1       f2 20.5 30.8       12.1  26.8
## 11 site1       f3 13.5 13.8       15.1  22.8
## 12 site1       f3 11.5 20.8       15.1  30.8
## 13 site1       f3 10.5 21.8       10.1  30.8
## 14 site1       f3 16.5 17.8       15.1  13.8
## 15 site1       f3 11.5 24.8       13.1  30.8
## 16 site1       f4 10.5 26.8       10.1  27.8
## 17 site1       f4 15.5 21.8       15.1  10.8
## 18 site1       f4 16.5 17.8       15.1  20.8
## 19 site1       f4 11.5 13.8       14.1  27.8
## 20 site1       f4 17.5 30.8       14.1  29.8
## 21 site1       f5 15.5 19.8       14.1  12.8
## 22 site1       f5 13.5 17.8       15.1  16.8
## 23 site1       f5 10.5 25.8       11.1  20.8
## 24 site1       f5 15.5 26.8       15.1  23.8
## 25 site1       f5 20.5 21.8       15.1  15.8
## 26 site2       f1 14.5 15.8       12.1  22.8
## 27 site2       f1 17.5 30.8       13.1  16.8
## 28 site2       f1 12.5 29.8       12.1  19.8
## 29 site2       f1 17.5 28.8       15.1  19.8
## 30 site2       f1 13.5 14.8       11.1  11.8
## 31 site2       f2 19.5 29.8       10.1  26.8
## 32 site2       f2 17.5 26.8       11.1  16.8
## 33 site2       f2 20.5 21.8       14.1  22.8
## 34 site2       f2 14.5 12.8       12.1  27.8
## 35 site2       f2 17.5 25.8       10.1  12.8
## 36 site2       f3 15.5 28.8       13.1  15.8
## 37 site2       f3 12.5 23.8       10.1  27.8
## 38 site2       f3 14.5 27.8       15.1  14.8
## 39 site2       f3 18.5 19.8       11.1  16.8
## 40 site2       f3 18.5 23.8       15.1  15.8
## 41 site2       f4 11.5 11.8       14.1  23.8
## 42 site2       f4 11.5 30.8       14.1  25.8
## 43 site2       f4 12.5 11.8       15.1  17.8
## 44 site2       f4 14.5 25.8       13.1  29.8
## 45 site2       f4 13.5 25.8       12.1  10.8
## 46 site2       f5 11.5 20.8       13.1  23.8
## 47 site2       f5 17.5 12.8       12.1  16.8
## 48 site2       f5 16.5 17.8       14.1  14.8
## 49 site2       f5 13.5 15.8       11.1  26.8
## 50 site2       f5 16.5 14.8       15.1  19.8
## 51 site3       f1 14.5 13.8       10.1  17.8
## 52 site3       f1 14.5 11.8       12.1  20.8
## 53 site3       f1 12.5 10.8       13.1  26.8
## 54 site3       f1 14.5 25.8       11.1  26.8
## 55 site3       f1 16.5 24.8       11.1  26.8
## 56 site3       f2 12.5 23.8       10.1  17.8
## 57 site3       f2 11.5 19.8       13.1  11.8
## 58 site3       f2 12.5 12.8       12.1  12.8
## 59 site3       f2 13.5 14.8       13.1  23.8
## 60 site3       f2 20.5 23.8       12.1  11.8
## 61 site3       f3 14.5 29.8       11.1  16.8
## 62 site3       f3 12.5 30.8       12.1  14.8
## 63 site3       f3 10.5 28.8       13.1  10.8
## 64 site3       f3 12.5 26.8       11.1  16.8
## 65 site3       f3 15.5 17.8       14.1  29.8
## 66 site3       f4 18.5 25.8       12.1  24.8
## 67 site3       f4 12.5 28.8       10.1  17.8
## 68 site3       f4 11.5 25.8       10.1  15.8
## 69 site3       f4 13.5 27.8       12.1  19.8
## 70 site3       f4 20.5 10.8       12.1  13.8
## 71 site3       f5 17.5 27.8       13.1  24.8
## 72 site3       f5 10.5 15.8       12.1  17.8
## 73 site3       f5 17.5 14.8       10.1  16.8
## 74 site3       f5 12.5 21.8       10.1  26.8
## 75 site3       f5 14.5 23.8       13.1  24.8

2.2.10 合并数据

data1 = data.frame(fam = c(1:8), 
                 site = c(rep("Nanjing", 4), 
                             rep("Hangzhou", 4)))
data1$site <- as.character(data1$site)
data1$fam <- as.character(data1$fam)
data2 = data.frame(fam = c(3:8), 
                 site = c(rep("Nanjing", 3), 
                             rep("Shanghai", 3)))

data2$site <- as.character(data2$site)
data2$fam <- as.character(data2$fam)
library(dplyr)
 
# 合并两个数据集并删除重复项
union(data1,data2)
##    fam     site
## 1    1  Nanjing
## 2    2  Nanjing
## 3    3  Nanjing
## 4    4  Nanjing
## 5    5 Hangzhou
## 6    6 Hangzhou
## 7    7 Hangzhou
## 8    8 Hangzhou
## 9    5  Nanjing
## 10   6 Shanghai
## 11   7 Shanghai
## 12   8 Shanghai

# 合并两个数据集保留重复项
union_all(data1,data2)
##    fam     site
## 1    1  Nanjing
## 2    2  Nanjing
## 3    3  Nanjing
## 4    4  Nanjing
## 5    5 Hangzhou
## 6    6 Hangzhou
## 7    7 Hangzhou
## 8    8 Hangzhou
## 9    3  Nanjing
## 10   4  Nanjing
## 11   5  Nanjing
## 12   6 Shanghai
## 13   7 Shanghai
## 14   8 Shanghai

# 合并两个数据集,保留两个数据集中相同的数据
intersect(data1,data2)
##   fam    site
## 1   3 Nanjing
## 2   4 Nanjing

# 合并两个数据集,保留两个数据集中不同的数据
setdiff(data1,data2)
##   fam     site
## 1   1  Nanjing
## 2   2  Nanjing
## 3   5 Hangzhou
## 4   6 Hangzhou
## 5   7 Hangzhou
## 6   8 Hangzhou

2.2.11 缺失值

如果一个数据集里面有缺失值,会对我们的数据统计分析产生影响,因此我们需要在统计分析之前对缺失值进行清除,我们这里增加一行缺失值,来进行统计对比:

 new_gr <- growth %>% mutate( nadata  =sample(x = c(1,NA,6,NA,8,10), size  = 75, replace = TRUE)  )
head(new_gr)
##    site families  dbh height zhi_height n_con nadata
## 1 site1       f1 10.5   26.8       12.1  15.8     NA
## 2 site1       f1 10.5   13.8       15.1  28.8     NA
## 3 site1       f1 11.5   12.8       10.1  17.8      6
## 4 site1       f1 20.5   22.8       10.1  24.8     10
## 5 site1       f1 17.5   24.8       12.1  23.8     10
## 6 site1       f2 16.5   20.8       10.1  29.8      8

我们对比一下有缺失值和去除缺失值的统计分析结果:

包含缺失值:

new_gr %>% group_by(site) %>% 
  summarise( mean = mean (nadata),
  max = max(nadata),
  min = min(nadata),
  sd = sd(nadata),
  cv= sd/mean )
## # A tibble: 3 x 6
##   site   mean   max   min    sd    cv
## * <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 site1    NA    NA    NA    NA    NA
## 2 site2    NA    NA    NA    NA    NA
## 3 site3    NA    NA    NA    NA    NA

去除缺失值:

new_gr %>% group_by(site) %>% 
  summarise( mean = mean (nadata,na.rm=T),
  max = max(nadata,na.rm=T),
  min = min(nadata,na.rm=T),
  sd = sd(nadata,na.rm=T),
  cv= sd/mean )
## # A tibble: 3 x 6
##   site   mean   max   min    sd    cv
## * <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 site1  7.56    10     1  2.77 0.367
## 2 site2  3.86    10     1  3.55 0.920
## 3 site3  7.6     10     1  3.02 0.397

可以看出影响很大。我们可以从数据集里面去除NA值,na.omit可以将所有包括NA值的数据样品都会被删除,例如:

dim(new_gr)
## [1] 75  7
gr_na_rem <- na.omit(new_gr)
dim(gr_na_rem)
## [1] 47  7

可以看出,所有含有NA值的样品都被去除了,最后剩下54个样品不包括NA值。如果你不想把NA的样品去除,而是想把NA替代为0,可以进行以下操作,比如:

#含有缺失值
summary(new_gr$nadata)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   3.500   8.000   6.468  10.000  10.000      28
new_gr[is.na(new_gr)] <- 0
summary(new_gr$nadata)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   1.000   4.053   8.000  10.000

NA值被替代成为0。tidyverse这个包功能很强大,还有很多我没介绍到的功能,大家可以参考参考 tidyverse网站查看更多信息。

2.2.12 数据由宽变长

在整理数据时,我们往往需要对数据进行重新排列,以便进行运算。比如我们的数据中除了 sitefamilies两个因子以外,还有胸径 dbh,树高 height,枝下高 zhi_height 以及 n_con四个数据变量,如果我们想把这个四个数据变量整合成一个因子变量,我们可以对数据进行宽变长的处理,在R中,长数据的形式更适合进行分析。这里需要用到 reshape2或者 tidyr安装包。

library(reshape2)
## 
## 载入程辑包:'reshape2'
## The following object is masked from 'package:tidyr':
## 
##     smiths
melt_growth <- melt(growth, id.vars = c('site','families'),
                    variable.name = 'four_value'
                    )
str(melt_growth)
## 'data.frame':    300 obs. of  4 variables:
##  $ site      : chr  "site1" "site1" "site1" "site1" ...
##  $ families  : chr  "f1" "f1" "f1" "f1" ...
##  $ four_value: Factor w/ 4 levels "dbh","height",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value     : num  10.5 10.5 11.5 20.5 17.5 16.5 16.5 16.5 15.5 20.5 ...
dim(melt_growth)
## [1] 300   4
library(tidyr)
## multiple id variables
data_long <- tidyr::gather(growth,four_value,value, dbh:n_con, factor_key=TRUE)
str(data_long)
## 'data.frame':    300 obs. of  4 variables:
##  $ site      : chr  "site1" "site1" "site1" "site1" ...
##  $ families  : chr  "f1" "f1" "f1" "f1" ...
##  $ four_value: Factor w/ 4 levels "dbh","height",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value     : num  10.5 10.5 11.5 20.5 17.5 16.5 16.5 16.5 15.5 20.5 ...
dim(data_long)
## [1] 300   4

这里我们保留 sitefamilies这两个因子变量,然后剩余的数据变量全部转变为一列因子变量,这里的variable 就包含了这四个数据的变量,数据变长了。

2.2.13 数据由长变宽

如果想把数据由长变宽,可以进行以下操作:

library(tidyr)
data_wide <- data_long %>% 
  tibble::rowid_to_column() %>% spread(four_value, value)
summary(data_wide)
##      rowid            site             families              dbh       
##  Min.   :  1.00   Length:300         Length:300         Min.   :10.50  
##  1st Qu.: 75.75   Class :character   Class :character   1st Qu.:12.50  
##  Median :150.50   Mode  :character   Mode  :character   Median :14.50  
##  Mean   :150.50                                         Mean   :14.77  
##  3rd Qu.:225.25                                         3rd Qu.:17.00  
##  Max.   :300.00                                         Max.   :20.50  
##                                                         NA's   :225    
##      height        zhi_height        n_con      
##  Min.   :10.80   Min.   :10.10   Min.   :10.80  
##  1st Qu.:15.80   1st Qu.:11.10   1st Qu.:15.80  
##  Median :21.80   Median :12.10   Median :19.80  
##  Mean   :21.57   Mean   :12.55   Mean   :20.65  
##  3rd Qu.:26.80   3rd Qu.:14.10   3rd Qu.:26.30  
##  Max.   :30.80   Max.   :15.10   Max.   :30.80  
##  NA's   :225     NA's   :225     NA's   :225

dcast function无法单独标记重复数据,因此如果数据中有重复数据,需要给一个方程,这里我用的是mean, 计算相同变量的平均值。

library(reshape2)
data_wide <- dcast(data_long,  site + families ~ four_value, 
                   na.rm = T,
                 fun.aggregate = mean,
                   value.var="value")
data_wide
##     site families  dbh height zhi_height n_con
## 1  site1       f1 14.1   20.2       11.9  22.2
## 2  site1       f2 17.1   21.4       12.1  22.8
## 3  site1       f3 12.7   19.8       13.7  25.8
## 4  site1       f4 14.3   22.2       13.7  23.4
## 5  site1       f5 15.1   22.4       14.1  18.0
## 6  site2       f1 15.1   24.0       12.7  18.2
## 7  site2       f2 17.9   23.4       11.5  21.4
## 8  site2       f3 15.9   24.8       12.9  18.2
## 9  site2       f4 12.7   21.2       13.7  21.6
## 10 site2       f5 15.1   16.4       13.1  20.4
## 11 site3       f1 14.5   17.4       11.5  23.8
## 12 site3       f2 14.1   19.0       12.1  15.6
## 13 site3       f3 13.1   26.8       12.3  17.8
## 14 site3       f4 15.3   23.8       11.3  18.4
## 15 site3       f5 14.5   20.8       11.7  22.2