根据层次结构查找唯一的分类计数

时间:2017-10-12 12:35:19

标签: r if-statement subset taxonomy

我已经搜索了执行此操作的方法,但使用count(unique())并不搜索其他因素。下面是一个示例数据集。

df <- data.frame(Site = c("X1", "X1", "X1"), Date = c(2006, 2006, 2006), TaxonID = c("Chironomidae", "Saetheria", "Chimarra"), Family = c("Chironomidae", "Chironomidae", "Philopotamidae"), Genus = c("-", "Saetheria", "Chimarra"), Count = c(2, 1, 5), stringsAsFactors = FALSE)

+------+------+--------------+----------------+-----------+-------+
| Site | Date |   TaxonID    |     Family     |   Genus   | Count |
+------+------+--------------+----------------+-----------+-------+
| X1   | 2006 | Chironomidae | Chironomidae   | -         |     2 |
| X1   | 2006 | Saetheria    | Chironomidae   | Saetheria |     1 |
| X1   | 2006 | Chimarra     | Philopotamidae | Chimarra  |     5 |
+------+------+--------------+----------------+-----------+-------+

计算TaxonID会超过计数,因为在这种情况下,由于识别出低于该分类水平的东西,即第2行,不应计算第1行。

在此数据集中,计算Genus中的唯一值将起作用,但在不存在第2行的示例中,这不会。

这是一个截断的表,通常还有Phylum,Class和Order,而TaxonID可能属于其中一个字段。

2 个答案:

答案 0 :(得分:0)

我不能100%确定这是否会给你正确的结果,但试试这个:

SELECT sum(cnt)
FROM
    (SELECT Family,
            IF(count(DISTINCT Genus)=0, 1, count(DISTINCT Genus)) AS cnt
     FROM your_table
     GROUP BY Family) AS lo;

答案 1 :(得分:0)

这可以通过对每个分类水平进行子集化并向数据框添加一列,然后嵌套ifelse语句来完成。如果你有办法改进它的成就,请告诉我。

在我发布的示例中:

data$GenusN <- ifelse(table(data$Genus)[data$Genus] >1, 0, 1)

对每个分类水平重复,然后根据嵌套的ifelse语句求和。

dataNew <- sum(ifelse(data$Taxon == data$Genus, data$GenusN, ifelse(data$Taxon==data$Family, data$FamilyN, 0)))