根据层次结构查找独特的分类学计数
Finding unique taxonomic counts based on hierarchy
我已经搜索过执行此操作的方法,但使用 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 会多算,因为在这种情况下,第 1 行不应被计算在内,因为某些东西被识别为低于该分类级别,即第 2 行。
在此数据集中,计算 Genus 中的唯一值将起作用,但在第 2 行不存在的示例中,这将不起作用。
这是一个截断的 table,其中通常还存在 Phylum、Class 和 Order,并且 TaxonID 可能是这些字段之一中的内容。
我不是 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;
这可以通过对每个分类级别进行子集化并向数据框中添加一列,然后嵌套 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)))
我已经搜索过执行此操作的方法,但使用 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 会多算,因为在这种情况下,第 1 行不应被计算在内,因为某些东西被识别为低于该分类级别,即第 2 行。
在此数据集中,计算 Genus 中的唯一值将起作用,但在第 2 行不存在的示例中,这将不起作用。
这是一个截断的 table,其中通常还存在 Phylum、Class 和 Order,并且 TaxonID 可能是这些字段之一中的内容。
我不是 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;
这可以通过对每个分类级别进行子集化并向数据框中添加一列,然后嵌套 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)))