我有一个像这样的数据集:
set.seed(1345)
df<-data.frame(month= c(rep(1,10), rep(2, 10), rep(3, 10)),
species=sample(LETTERS[1:10], 30, replace= TRUE))
我想遍历每个月并计算物种多样性。我知道diversity
中的library("vegan")
之类的函数,并且知道使用该路由的问题的解决方案(下面提供的代码),但是作为一个带有循环的练习,我试图创建一个{{1 }}或函数,它显示了Shannons分集和Simpsons分集的特定计算,因此每个索引的计算都不神秘。它们使用以下公式计算:
到目前为止,我已经为Simpsons尝试了以下方法:
for loop
对于香农,还有以下内容:
df <-
df %>%
group_by(month, species) %>%
summarise(freq = n())
div<-NA
for (i in length(unique(df$month))) {
sum<- sum(df$freq)
for (i in unique (df$freq)){
p<- df$freq /sum
p.sqrd<-p*p
div[i]<-1/sum(p.sqrd)
}}
我不是在创建成功的循环,而是希望帮助正确索引该循环并创建效率最高的循环(即将df <-
df %>%
group_by(month, species) %>%
summarise(freq = n())
div<-NA
for (i in length(unique(df$month))) {
sum<- sum(df$freq)
for (i in unique (df$freq)){
p<- df$freq /sum
log.p<-ln(p)
div[i]<- sum(p[i]*ln(p[i]))
}}
合并到循环中)和一个for循环,以清楚地说明该循环内的方程式。
使用df <- df %>% group_by(month, species) %>% summarise(freq = n())
函数,这是辛普森分集式的答案:
diversity
对于香农:
library("tidyverse")
df <-
df %>%
group_by(month, species) %>%
summarise(freq = n())
# Cast dataframe of interaction frequencies into a matrix
library("reshape2")
ph_mat<- dcast(df, month~ species)
ph_mat[is.na(ph_mat)] <- 0 #changes
library("vegan")
df<- data.frame(div=diversity(ph_mat, index="simpson"),
month=unique(ph_mat$month))
答案 0 :(得分:0)
我这里有一个不包含for循环的解决方案,但是在这里我定义和解释了一个函数来计算每个索引(没有任何神秘感!),它计算每个月的每个多样性指标。它使用group_by()
中的summarize()
和dplyr
函数。
set.seed(1345)
df<-data.frame(month= c(rep(1,10), rep(2, 10), rep(3, 10)),
species=sample(LETTERS[1:10], 30, replace= TRUE))
calc_shannon <- function(community) {
p <- table(community)/length(community) # Find proportions
p <- p[p > 0] # Get rid of zero proportions (log zero is undefined)
-sum(p * log(p)) # Calculate index
}
calc_simpson <- function(community) {
p <- table(community)/length(community) # Find proportions
1 / sum(p^2) # Calculate index
}
diversity_metrics <-
df %>%
group_by(month) %>%
summarize(shannon = calc_shannon(species),
simpson = calc_simpson(species))