第 2 章 数据清洗
在我们了解了如何创建和导入数据以后,接下来就到了比较关键的环节,数据清洗,当我们导入数据以后,很多时候数据的格式和内容不太符合我们的要求,因此就需要进行数据整理,以便我们对数据有个清晰的了解和方便后面模型构建。这里我们用我们1.4创建的数据进行操作,简单给大家讲一些常见的数据处理方法。关于数据整理有两个安装包非常值得推荐给大家,那就是 dplyr
和 tidyverse
, 其中 tidyverse
是整合了多个数据处理安装包于一体的安装包,加载这个安装包,那基本的数据处理包和绘图包都会自动加载,这样就节省了一一调用其他个别安装包的麻烦,但有时也会造成代码重叠问题,因为有些程序代码是同时出现在两个或者多个安装包内,但可能会有所不同,因此要视情况而定。
2.1 数据描述
2.1.1 描述统计
当我们得到数据以后,我们需要先了解一下数据的结构,以方便我们对数据做进一步处理,我们先调用R base
自带的 str
和summary
程序来查看一下数据的类型,以及各类型的具体内容。
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里面,数据可以一般可以分为一维、二维和三维数据,在光谱数据中,一般为二维数据,而高光谱数据则为三维数据,包含更多信息。
#一维数据
<- c(1,2,3,4,5)
a <- c(2,3,4,5,6)
b str(b)
## num [1:5] 2 3 4 5 6
##二维数据
<- cbind(a,b)
ab dim(ab)
## [1] 5 2
## 三维数据
library(reticulate)
<- array_reshape(ab, c(5, 2,1))
ab_array dim(ab_array)
## [1] 5 2 1
我们将在后面高光谱数据建模时经常用到三维数据。
2.2 数据整理
dplyr是一个非常实用并且运算速度很快的数据整理安装包,接下来我们通过示例来介绍一下这个安装包的一些主要的功能。
2.2.1 添加变量
如果我们想在原有的数据上增加一列,我们可以使用dplyr
中的 mutate
程序。比如我们想在这个生长数据中添加N含量的数据,示例如下:
library(dplyr)
<- mutate(growth, n_con =sample(x = 10.8:30.8, size = 75, replace = TRUE) )
growth 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)
<- growth %>% select(-dbh)
gro 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)
<- growth %>% select(-c(dbh,height))
gro1 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 统计分析
%>% summarise( mean = mean (dbh),
growth 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 选择变量
#选择单个变量
<- growth %>% select(dbh)
growth1 head(growth1)
## dbh
## 1 10.5
## 2 10.5
## 3 11.5
## 4 20.5
## 5 17.5
## 6 16.5
#选择多个变量
<- growth %>% select(dbh,n_con)
growth1 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 选择变量统计分析
%>% select(dbh) %>% summarise( mean = mean (dbh),
growth 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
%>% group_by(site)%>% select(dbh) %>% summarise( mean = mean (dbh),
growth 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进行统计信息。
%>% group_by(families,site) %>%
growth 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)
%>% filter( dbh >15 & dbh <16) growth
## 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)
%>% filter( dbh < 15 & site == 'site1') 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 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)
%>% filter( dbh < 15 & !site == 'site1') growth
## 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)
%>% filter( dbh == 15.5) growth
## 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 重新排列
我们可以根据特定分组进行数据重新排序。 比如我们根据树高进行整体数据 升序排列:
%>% arrange( height)
growth ## 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
降序排列:
%>% arrange( desc (height))
growth ## 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:
%>% rename(hei = height,DBH = dbh )
growth ## 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 合并数据
= data.frame(fam = c(1:8),
data1 site = c(rep("Nanjing", 4),
rep("Hangzhou", 4)))
$site <- as.character(data1$site)
data1$fam <- as.character(data1$fam)
data1= data.frame(fam = c(3:8),
data2 site = c(rep("Nanjing", 3),
rep("Shanghai", 3)))
$site <- as.character(data2$site)
data2$fam <- as.character(data2$fam)
data2library(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 缺失值
如果一个数据集里面有缺失值,会对我们的数据统计分析产生影响,因此我们需要在统计分析之前对缺失值进行清除,我们这里增加一行缺失值,来进行统计对比:
<- growth %>% mutate( nadata =sample(x = c(1,NA,6,NA,8,10), size = 75, replace = TRUE) )
new_gr 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
我们对比一下有缺失值和去除缺失值的统计分析结果:
包含缺失值:
%>% group_by(site) %>%
new_gr 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
去除缺失值:
%>% group_by(site) %>%
new_gr 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
<- na.omit(new_gr)
gr_na_rem 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
is.na(new_gr)] <- 0
new_gr[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 数据由宽变长
在整理数据时,我们往往需要对数据进行重新排列,以便进行运算。比如我们的数据中除了 site
和 families
两个因子以外,还有胸径 dbh
,树高 height
,枝下高 zhi_height
以及 n_con
四个数据变量,如果我们想把这个四个数据变量整合成一个因子变量,我们可以对数据进行宽变长的处理,在R中,长数据的形式更适合进行分析。这里需要用到 reshape2
或者 tidyr
安装包。
library(reshape2)
##
## 载入程辑包:'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
<- melt(growth, id.vars = c('site','families'),
melt_growth 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
<- tidyr::gather(growth,four_value,value, dbh:n_con, factor_key=TRUE)
data_long 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
这里我们保留 site
和 families
这两个因子变量,然后剩余的数据变量全部转变为一列因子变量,这里的variable 就包含了这四个数据的变量,数据变长了。
2.2.13 数据由长变宽
如果想把数据由长变宽,可以进行以下操作:
library(tidyr)
<- data_long %>%
data_wide ::rowid_to_column() %>% spread(four_value, value)
tibblesummary(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)
<- dcast(data_long, site + families ~ four_value,
data_wide 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