R语言【taxlist】——对多样性记录的物种列表使用 taxlist 的指南

时间:2024-01-26 11:08:24

1. 起步(安装与加载)

taxlist 包通过一个对象类和功能(方法)处理分类数据。同名对象类 taxlist 可以进一步与生物多样性记录联系起来(例如,用于植被样地的观测)。

taxlist 包是在repository GitHub (https://github.com/kamapu/taxlist)上开发的,可以使用devtools包安装在R-session中:

library(devtools)

install_github("kamapu/taxlist", build_vignettes=TRUE)

由于这个包已经发表在CRAN中可用,所以也可以使用 install.packages 函数来安装它:

install.packages("taxlist", dependencies = TRUE)

当然,您必须将 taxlist 加载到 R 会话中。

library(taxlist)

2. 从植被表中提取物种列表

2.1 示例数据

taxlist 的主要任务之一是构建分类信息,以便与生物多样性记录进一步联系。这种结构一方面必须与分类学问题(例如同义词、层次结构等)保持一致,另一方面必须灵活地包含不同深度的信息可用性(从普通的物种列表到层次结构)。

示例数据可以通过下行命令加载:

load(file.path(path.package("taxlist"), "Cross.rda"))

示例数据的格式采用 R 的 data.frame,第一列保存这物种名称:

head(Cross[, 1:8])
                TaxonName 3094 3093 3092 3095 3096 3097 3098
1   Eragrostis tenuifolia    + <NA> <NA> <NA> <NA> <NA> <NA>
2        Cyperus sublimis <NA>    + <NA> <NA> <NA> <NA> <NA>
3    Digitaria abyssinica    +    1    2    2    2    3    1
4 Hyparrhenia filipendula <NA> <NA> <NA> <NA> <NA> <NA> <NA>
5    Erigeron floribundus    +    1 <NA> <NA> <NA> <NA> <NA>
6            Aerva lanata    +    1 <NA> <NA> <NA> <NA> <NA>

2.2 普通列表转换为 taxlist

如前所述,交叉关联表的首列是观察样地中出现的物种的名称。因此,我们可以使用这个字符向量来构造一个 taxlist 对象。这可以通过函数 df2taxlist() 实现。

我们可以通过物种名称来构造 taxlist 对象:

sp_list <- Cross[, "TaxonName"]
sp_list <- df2taxlist(x = sp_list)

运行后,在 R 控制台中显示如下内容:

Missing column 'TaxonConceptID' in 'x'. All names will be considered as accepted names.

随即,我们可以查看刚创建的对象信息:

summary(sp_list)

sp_list 对象的信息如下:

object size: 9 Kb 
validation of 'taxlist' object: TRUE 

number of taxon usage names: 35 
number of taxon concepts: 35 
trait entries: 0 
number of trait variables: 0 
taxon views: 0

注意:summary 函数提供了快速浏览对象的信息。当然此函数也可以只针对某一个类群:

summary(object = sp_list, ConceptID = "Erigeron floribundus")

随即在 R 控制台上出现了 Erigeron floribundus 的概要信息:

------------------------------ 
concept ID: 5 
view ID: none 
level: none 
parent: none 

# accepted name: 
5 Erigeron floribundus NA 
------------------------------

3. 内置的数据集

3.1 Easplist

安装 taxlist 包括 Easplist 数据集,它被格式化为一个 taxlist 对象。该数据是数据库SWEA-Dataveg (GIVD ID AF-006)使用的物种列表的一个子集:

我们可以通过 data 来加载 Easplist 数据集,并查看一下该数据集的大概情况:

data(Easplist)
Easplist

随即在 R 控制台中会显示以下信息:

object size: 761.4 Kb 
validation of 'taxlist' object: TRUE 

number of taxon usage names: 5393 
number of taxon concepts: 3887 
trait entries: 311 
number of trait variables: 1 
taxon views: 3 

concepts with parents: 3698 
concepts with children: 1343 

hierarchical levels: form < variety < subspecies < species < complex < genus < family 
number of concepts in level form: 2
number of concepts in level variety: 95
number of concepts in level subspecies: 71
number of concepts in level species: 2521
number of concepts in level complex: 1
number of concepts in level genus: 1011
number of concepts in level family: 186

3.2 访问数据集(set)的组分(slot)

注意:taxlist 对象是通过 S4 对象搭建的。

注意:S4 对象包括的组分统称为 slot,taxlist 对象有 4 个 slots。

访问 S4 对象中 slots 的内容的常用方法是使用 slot(object, name) 或者通过 @ 符号(即:object@name)。

taxlist 对象的特定函数包括 taxon_namestaxon_relationstaxon_traits 和 taxon_views(如有需要,请查阅帮助文档)。

此外,还可以使用 $ 和 [ 方法,第一个方法可以访问 slot taxonTraits,而第二个方法也可以访问对象中的其他 slots。

比如,访问 Easplist 数据集中的 life_form slot:

summary(as.factor(Easplist$life_form))
  acropleustophyte        chamaephyte     climbing_plant facultative_annual    obligate_annual       phanerophyte 
                 8                 25                 25                 20                114                 26 
  pleustohelophyte         reed_plant      reptant_plant      tussock_plant               NA's 
                 8                 14                 19                 52               3576 

3.3 创建子集(subsets)

本包中构建了 subset 方法。这些子集通常应用模式匹配(用于字符向量)或逻辑操作,类似于关系数据库中的查询构建。通过设置 参数【slot】的值,可以将 subset 方法对任何 slot 使用。

对 Easplist 数据集应用 slot 方法,设置参数【subset】和参数【slot】,通过物种名称来构建子集:

Papyrus <- subset(x = Easplist, subset = grepl("papyrus", TaxonName), slot = "names")
summary(Papyrus, "all")

R 控制台可以看到子集 Papyrus 的基本信息:

------------------------------ 
concept ID: 206 
view ID: 1 
level: species 
parent: none 

# accepted name: 
206 Cyperus papyrus L. 

# synonyms (2): 
52612 Cyperus papyrus ssp. antiquorum (Willd.) Chiov. 
52613 Cyperus papyrus ssp. nyassicus Chiov. 
------------------------------

或者换一种思路,通过物种ID来构建子集:

Papyrus <- subset(x = Easplist, subset = TaxonConceptID == 206, slot = "relations")
summary(Papyrus, "all")

控制台中显示的子集信息与上述一致:

------------------------------ 
concept ID: 206 
view ID: 1 
level: species 
parent: none 

# accepted name: 
206 Cyperus papyrus L. 

# synonyms (2): 
52612 Cyperus papyrus ssp. antiquorum (Willd.) Chiov. 
52613 Cyperus papyrus ssp. nyassicus Chiov. 
------------------------------

上面构建的是属级的子集,进一步地,还可以构建种级子集:

Phraaus <- subset(
  x = Easplist,
  subset = charmatch("Phragmites australis", TaxonName), slot = "names"
)
summary(Phraaus, "all")

控制台中显示子集的信息:

------------------------------ 
concept ID: 51996 
view ID: 1 
level: species 
parent: none 

# accepted name: 
51996 Phragmites australis (Cav.) Trin. ex Steud. 

# synonyms (9): 
51997 Phragmites mauritianus Kunth 
53276 Phragmites vulgaris (Lam.) Crép. 
53277 Arundo australis Cav. 
53278 Arundo vulgaris Lam. 
53279 Phragmites australis ssp. humilis (De Not.) Kerguélen 
53280 Phragmites humilis De Not. 
53281 Phragmites communis var. humilis (De Not.) Parl. 
53282 Arundo phragmites L. 
53283 Phragmites pungens Hack. 
------------------------------

3.4 分类层级结构

taxlist 对象有可能包括分类群的父子关系和分类等级。Easplist 数据集中自然包括这些信息,如下所示:

Easplist
object size: 761.4 Kb 
validation of 'taxlist' object: TRUE 

number of taxon usage names: 5393 
number of taxon concepts: 3887 
trait entries: 311 
number of trait variables: 1 
taxon views: 3 

concepts with parents: 3698 
concepts with children: 1343 

hierarchical levels: form < variety < subspecies < species < complex < genus < family 
number of concepts in level form: 2
number of concepts in level variety: 95
number of concepts in level subspecies: 71
number of concepts in level species: 2521
number of concepts in level complex: 1
number of concepts in level genus: 1011
number of concepts in level family: 186

注意:使用 subset() 构建的子集会丢失这些信息,因为原始数据集的父节点或子节点不在子集中。如果你打算恢复父节点和子节点,可以分别使用 get_parents() 或 get_children()。

比如上面构建的 Papyrus 子集并没有包括父子关系的信息:

summary(Papyrus, "all")
------------------------------ 
concept ID: 206 
view ID: 1 
level: species 
parent: none 

# accepted name: 
206 Cyperus papyrus L. 

# synonyms (2): 
52612 Cyperus papyrus ssp. antiquorum (Willd.) Chiov. 
52613 Cyperus papyrus ssp. nyassicus Chiov. 
------------------------------

那么,可以使用 get_parents() 为 Papyrus 子集恢复父节点:

Papyrus <- get_parents(Easplist, Papyrus)
summary(Papyrus, "all")

可以看到 Papyrus 子集中出现了物种对应的属和科信息:

------------------------------ 
concept ID: 206 
view ID: 1 
level: species 
parent: 54853 Cyperus L. 

# accepted name: 
206 Cyperus papyrus L. 

# synonyms (2): 
52612 Cyperus papyrus ssp. antiquorum (Willd.) Chiov. 
52613 Cyperus papyrus ssp. nyassicus Chiov. 
------------------------------ 
concept ID: 54853 
view ID: 2 
level: genus 
parent: 55959 Cyperaceae Juss. 

# accepted name: 
54855 Cyperus L. 
------------------------------ 
concept ID: 55959 
view ID: 3 
level: family 
parent: none 

# accepted name: 
55961 Cyperaceae Juss. 
------------------------------

此外,还有一种表示分类等级树的方法 indentted_list():

indented_list(Papyrus)

可以看到控制台中输出了 Papyrus 子集的分类树关系,十分简洁:

Cyperaceae Juss.
 Cyperus L.
   Cyperus papyrus L. 

4. 对 syntaxonomic scheme 应用 taxlist

4.1 植物群落学分类的例子

为了说明 taxlist 对象的灵活性,下面的示例中将处理一个 syntaxonomic scheme。示例数据结构包括 10 个类群,分为 4 类。


4.2 构建 taxlist 对象

分类信息表保存在一个数据帧中,可以通过下列命令加载:

load(file.path(path.package("taxlist"), "wetlands_syntax.rda"))

在加载得到的 Concepts 数据集中,包含了一列群落分类群名称(syntaxon names),这些群落分类群在之前的数据中等价于物种接受名。该列表将用于在 taxlist 对象中插入新概念(concept)。

Concepts 的内容结构大概如下:

head(Concepts)
  TaxonConceptID Parent                                TaxonName                                 AuthorName
1              1     NA                         Lemnetea minoris    Koch & Tüxen ex den Hartog & Segal 1964
2              2      1                 Salvinio-Eichhornietalia Borhidi ex Borhidi, Muñiz & del Risco 1979
3              3      2                       Pistion stratiotes                (Schmitz 1971) Schmitz 1988
4              4      3 Lemno paucicostatae-Pistietum stratiotes                                Lebrun 1947
5              5     NA                                Potametea                Klika ex Klika & Novák 1941
6              6      5                       Nymphaeetalia loti                                Lebrun 1947
        Level
1       class
2       order
3    alliance
4 association
5       class
6       order

根据 Concepts 的 TaxonConceptID 列用来构建新的 TaxonUsageID 列:

Concepts$TaxonUsageID <- Concepts$TaxonConceptID

最后,使用 df2taxlist 方法构建 taxlist 对象:

Syntax <- df2taxlist(Concepts)

控制台中会输出警告信息:

No values for 'AcceptedName' in 'x'. all names will be considered as accepted names.

使用 level() 为 Syntax 数据集设置新的分类等级:

levels(Syntax) <- c("association", "alliance", "order", "class")

使用 taxon_views() 为 Syntax 数据集设置物种的考证信息:

taxon_views(Syntax) <- data.frame(
  ViewID = 1, Secundum = "Alvarez (2017)",
  Author = "Alvarez M", Year = 2017,
  Title = "Classification of aquatic and semi-aquatic vegetation in East Africa",
  stringsAsFactors = FALSE
)

使用 @ 可以访问 Syntax 数据集的 slot,使用 $ 可以访问 slot 中的变量:

Syntax@taxonRelations$ViewID <- 1

所有操作完成后,再来查看一下 Syntax 数据集:

Syntax

可以看到,对比原始数据集 Concepts,Syntax 有了 taxlist 类的标准格式:

object size: 11.2 Kb 
validation of 'taxlist' object: TRUE 

number of taxon usage names: 26 
number of taxon concepts: 26 
trait entries: 0 
number of trait variables: 0 
taxon views: 1 

concepts with parents: 22 
concepts with children: 16 

hierarchical levels: association < alliance < order < class 
number of concepts in level association: 10
number of concepts in level alliance: 7
number of concepts in level order: 5
number of concepts in level class: 4

注意:new() 方法可以创建一个空的 taxlist 对象(prototype),而 leves() 方法可以设置自定义的分类等级(syntaxonomical hierarchies)。

对于后者,插入的分类等级必须是从低到高。

然后,使用 taxon_views() 方法将定义 syntaxonomic scheme中包含的概念的引用插入到对象中;

最后,使用 add_concept() 方法插入概念。

下面,将插入那些被认为是各自 syntaxa 同义词的名称。

同义词包含在数据集 Synonyms中。

head(Synonyms)
  TaxonConceptID                             TaxonName                 AuthorName
1              1                          Stratiotetea    den Hartog & Segal 1964
2              3                  Pistion pantropicale               Schmitz 1971
3              8               Utriculario-Nymphaeetum (Lebrun 1947) Léonard 1950
4              8 Utriculario exoletae-Nymphaeetum loti    Szafranski & Apema 1983
5              9                          Phragmitetea      Tüxen & Preising 1942
6             10                           Papyretalia                Lebrun 1947

使用 add_synonym() 方法向 Syntax 中添加同义词信息:

Syntax <- add_synonym(Syntax,
  ConceptID = Synonyms$TaxonConceptID,
  TaxonName = Synonyms$TaxonName, AuthorName = Synonyms$AuthorName
)

最后,关联的代码号将作为i他们的属性值插入到 taxonTraits slot中。

head(Codes)
  TaxonConceptID Code
1             12  HE1
2             13  HE2
3             14  HE3
4             20  HE4
5             17  HE5
6             18  HE6

使用 taxon_traits() 为 Syntax 设置特征信息:

taxon_traits(Syntax) <- Codes
Syntax
object size: 13.8 Kb 
validation of 'taxlist' object: TRUE 

number of taxon usage names: 37 
number of taxon concepts: 26 
trait entries: 10 
number of trait variables: 1 
taxon views: 1 

concepts with parents: 22 
concepts with children: 16 

hierarchical levels: association < alliance < order < class 
number of concepts in level association: 10
number of concepts in level alliance: 7
number of concepts in level order: 5
number of concepts in level class: 4

比如,您可以通过关联获得父子链:

Nymplot <- subset(Syntax, charmatch("Nymphaeetum", TaxonName), slot = "names")
summary(Nymplot, "all")
------------------------------ 
concept ID: 8 
view ID: 1 
level: association 
parent: none 

# accepted name: 
8 Nymphaeetum loti Lebrun 1947 

# synonyms (2): 
29 Utriculario-Nymphaeetum (Lebrun 1947) Léonard 1950 
30 Utriculario exoletae-Nymphaeetum loti Szafranski & Apema 1983 
------------------------------

注意:逻辑值参数【keep_parents】和参数【keep_children】来保留子集中的分类等级信息:

Nymplot <- subset(Syntax, charmatch("Nymphaeetum", TaxonName),
  slot = "names",
  keep_parents = TRUE
)
summary(Nymplot, "all")
------------------------------ 
concept ID: 5 
view ID: 1 
level: class 
parent: none 

# accepted name: 
5 Potametea Klika ex Klika & Novák 1941 
------------------------------ 
concept ID: 6 
view ID: 1 
level: order 
parent: 5 Potametea Klika ex Klika & Novák 1941 

# accepted name: 
6 Nymphaeetalia loti Lebrun 1947 
------------------------------ 
concept ID: 7 
view ID: 1 
level: alliance 
parent: 6 Nymphaeetalia loti Lebrun 1947 

# accepted name: 
7 Nymphaeion loti Lebrun 1947 
------------------------------ 
concept ID: 8 
view ID: 1 
level: association 
parent: 7 Nymphaeion loti Lebrun 1947 

# accepted name: 
8 Nymphaeetum loti Lebrun 1947 

# synonyms (2): 
29 Utriculario-Nymphaeetum (Lebrun 1947) Léonard 1950 
30 Utriculario exoletae-Nymphaeetum loti Szafranski & Apema 1983 
------------------------------

通过 indented_list() 方法简便地展示 Nymplot 的分类树:

indented_list(Nymplot)
Potametea Klika ex Klika & Novák 1941
 Nymphaeetalia loti Lebrun 1947
  Nymphaeion loti Lebrun 1947
   Nymphaeetum loti Lebrun 1947