使用 dplyr 总结 运行 个不同的因素
Using dplyr to summarise a running total of distinct factors
我正在尝试为相机捕获调查生成物种饱和度曲线。我有成千上万的观察结果,并在 dplyr 中进行了大部分操作。
我有三个野外地点,有数周诱捕的不同动物物种的观察记录。有些星期没有动物,有些星期可能不止一种动物。我想为每个站点生成一个单独的数字,以比较在连续几周的研究中遇到新物种的速度。一旦在该地区捕获了总物种多样性,这些对新物种的观察最终应该会饱和。一些现场站点可能比其他现场站点饱和得更快。
问题是我还没有找到一种方法来计算不同物种的数量以按时间提供 运行 总数。下面是一个简单的虚拟数据集。
field_site<-c(rep("A",4),rep("B",4),rep("C",4))
week<-c(1,2,2,3,2,3,4,4,1,2,3,4)
animal<-c("dog","dog","cat","rabbit","dog","dog","dog","rabbit","cat","cat","rabbit","dog")
df<-as.data.frame(cbind(field_site,week,animal),head=TRUE)
我可以很容易地生成每周分组内独特物种的数量,例如
tbl_df(df)%>%
group_by(field_site,week) %>%
summarise(no_of_sp=n_distinct(animal))
但这对随后几周再次遇到某些物种的事实并不敏感。我真正需要的是 运行 不同物种的计数,即从第 1 周开始逐行计算每个站点的独特物种,假设数据是按从调查开始的递增时间排序的。
在现场 A 的示例中,研究过程中每周遇到的物种累计总数为:第 1 周 = 1 个物种,第 2 周 = 2 个物种,第 3 周 = 3 个物种,第 4 周 =还是3种。
站点 B 的累计物种总数为:第 1 周 = 0 种,第 2 周 = 1 种,第 3 周 = 1 种,第 4 周 = 1 种,依此类推...
如有任何建议,我们将不胜感激。
提前干杯!
我有两个假设:
- 站点 B,第 4 周 = 2 个物种,"dog" 和 "rabbit";和
- 所有网站共享相同的周,因此如果网站上至少有第 4 周,则所有网站都应包含它。这只会驱动
mt
(空)变量,请随时更新此变量。
我首先建议 "empty" data.frame 以确保站点填充了必要的周数:
mt <- expand.grid(field_site = unique(ret$field_site),
week = unique(ret$week))
tidyr
的使用帮助:
library(tidyr)
df %>%
mutate(fake = TRUE) %>%
# ensure all species are "represented" on each row
spread(animal, fake) %>%
# ensure all weeks are shown, even if no species
full_join(mt, by = c("field_site", "week")) %>%
# ensure the presence of a species persists at a site
arrange(week) %>%
group_by(field_site) %>%
mutate_if(is.logical, funs(cummax(!is.na(.)))) %>%
ungroup() %>%
# helps to contain variable number of species columns in one place
nest(-field_site, -week, .key = "species") %>%
group_by(field_site, week) %>%
# could also use purrr::map in place of sapply
mutate(n = sapply(species, sum)) %>%
ungroup() %>%
select(-species) %>%
arrange(field_site, week)
# # A tibble: 12 × 3
# field_site week n
# <fctr> <fctr> <int>
# 1 A 1 1
# 2 A 2 2
# 3 A 3 3
# 4 A 4 3
# 5 B 1 0
# 6 B 2 1
# 7 B 3 1
# 8 B 4 2
# 9 C 1 1
# 10 C 2 1
# 11 C 3 2
# 12 C 4 3
我正在尝试为相机捕获调查生成物种饱和度曲线。我有成千上万的观察结果,并在 dplyr 中进行了大部分操作。
我有三个野外地点,有数周诱捕的不同动物物种的观察记录。有些星期没有动物,有些星期可能不止一种动物。我想为每个站点生成一个单独的数字,以比较在连续几周的研究中遇到新物种的速度。一旦在该地区捕获了总物种多样性,这些对新物种的观察最终应该会饱和。一些现场站点可能比其他现场站点饱和得更快。
问题是我还没有找到一种方法来计算不同物种的数量以按时间提供 运行 总数。下面是一个简单的虚拟数据集。
field_site<-c(rep("A",4),rep("B",4),rep("C",4))
week<-c(1,2,2,3,2,3,4,4,1,2,3,4)
animal<-c("dog","dog","cat","rabbit","dog","dog","dog","rabbit","cat","cat","rabbit","dog")
df<-as.data.frame(cbind(field_site,week,animal),head=TRUE)
我可以很容易地生成每周分组内独特物种的数量,例如
tbl_df(df)%>%
group_by(field_site,week) %>%
summarise(no_of_sp=n_distinct(animal))
但这对随后几周再次遇到某些物种的事实并不敏感。我真正需要的是 运行 不同物种的计数,即从第 1 周开始逐行计算每个站点的独特物种,假设数据是按从调查开始的递增时间排序的。
在现场 A 的示例中,研究过程中每周遇到的物种累计总数为:第 1 周 = 1 个物种,第 2 周 = 2 个物种,第 3 周 = 3 个物种,第 4 周 =还是3种。
站点 B 的累计物种总数为:第 1 周 = 0 种,第 2 周 = 1 种,第 3 周 = 1 种,第 4 周 = 1 种,依此类推...
如有任何建议,我们将不胜感激。 提前干杯!
我有两个假设:
- 站点 B,第 4 周 = 2 个物种,"dog" 和 "rabbit";和
- 所有网站共享相同的周,因此如果网站上至少有第 4 周,则所有网站都应包含它。这只会驱动
mt
(空)变量,请随时更新此变量。
我首先建议 "empty" data.frame 以确保站点填充了必要的周数:
mt <- expand.grid(field_site = unique(ret$field_site),
week = unique(ret$week))
tidyr
的使用帮助:
library(tidyr)
df %>%
mutate(fake = TRUE) %>%
# ensure all species are "represented" on each row
spread(animal, fake) %>%
# ensure all weeks are shown, even if no species
full_join(mt, by = c("field_site", "week")) %>%
# ensure the presence of a species persists at a site
arrange(week) %>%
group_by(field_site) %>%
mutate_if(is.logical, funs(cummax(!is.na(.)))) %>%
ungroup() %>%
# helps to contain variable number of species columns in one place
nest(-field_site, -week, .key = "species") %>%
group_by(field_site, week) %>%
# could also use purrr::map in place of sapply
mutate(n = sapply(species, sum)) %>%
ungroup() %>%
select(-species) %>%
arrange(field_site, week)
# # A tibble: 12 × 3
# field_site week n
# <fctr> <fctr> <int>
# 1 A 1 1
# 2 A 2 2
# 3 A 3 3
# 4 A 4 3
# 5 B 1 0
# 6 B 2 1
# 7 B 3 1
# 8 B 4 2
# 9 C 1 1
# 10 C 2 1
# 11 C 3 2
# 12 C 4 3