У меня есть такой набор данных:
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")
, и я знаю решения моего вопроса, используя этот маршрут (код приведен ниже), но в качестве упражнения для себя с циклами я пытаюсь создать 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]))
}}
Я не создаю успешный цикл и хотел бы помочь правильно проиндексировать этот цикл и создать наиболее эффективный (т.е. включающий df <- df %>% group_by(month, species) %>% summarise(freq = n())
в цикл) и цикл for, которыйчетко иллюстрирует уравнение в цикле.
Используя функцию 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))
А для Шеннона:
library("vegan")
df<- data.frame(div=diversity(ph_mat, index="shannon"),
month=unique(ph_mat$month))