我有一个数据框,其中包含两次单独访问期间在某个地点检测到某种鸟类的次数(n=110):
Site Yr Total.ACFL Total.AMCR Total.AMGO Total.AMKE Total.AMRE
<chr> <int> <int> <int> <int> <int> <int>
1 BRY1 2021 0 0 0 0 0
2 BRY2 2021 0 0 3 0 0
3 BRY2 2021 1 0 2 0 0
4 BRY3 2021 0 0 2 0 0
5 BRY3 2021 0 0 7 0 0
6 BRY4 2021 0 0 1 0 0
7 BRY4 2021 0 0 1 0 0
8 BRY5 2021 0 0 4 0 0
9 BRY5 2021 0 0 4 0 0
10 BRY6 2021 0 0 8 0 0
共有 56 种(以 Total. 开头的列)。我想要做的是确定每个地点的总物种丰富度(检测到的独特物种的数量)。我想生成一个脚本,通过确定每个站点至少包含一次检测的列数(例如 Total.ACFL)来实现此目的。例如,由于在两次访问期间检测到 AMGO 和 ACFL,因此站点 BRY2 的物种丰富度为 2。
任何帮助将不胜感激。
到目前为止,我还没有尝试过任何东西(坦白说,有点不知所措),但我希望能被引导到正确的方向。假设我可能会使用素食套餐来发挥我的优势。
您可以首先将数据框重塑为“长”格式以便于操作,然后计算值> 0的物种数量。
library(dplyr)
df |>
pivot_longer(starts_with("Total")) |>
summarize(value = sum(value), .by = c(Site, Yr, name)) |>
summarize(count = sum(value > 0), .by = c(Site, Yr))
另一种方法使用
reframe()
。这不需要重塑数据框。
df |>
summarize(across(starts_with("Total"), sum), .by = c(Site, Yr)) |>
reframe(count = rowSums(pick(starts_with("Total")) > 0), .by = c(Site, Yr))
它们具有相同的输出:
# A tibble: 6 × 3
Site Yr count
<chr> <int> <dbl>
1 BRY1 2021 0
2 BRY2 2021 2
3 BRY3 2021 1
4 BRY4 2021 1
5 BRY5 2021 1
6 BRY6 2021 1
这里有一句台词:
summarise(df, richness = rowSums(across(starts_with("Total"), ~ sum(.) > 0)), .by = Site)
输出:
# A tibble: 6 × 2
Site richness
<chr> <dbl>
1 BRY1 0
2 BRY2 2
3 BRY3 1
4 BRY4 1
5 BRY5 1
6 BRY6 1