我已经搜索了执行此操作的方法,但使用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可能属于其中一个字段。
答案 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)))