遍历数据集以计算资产剥离

时间:2018-11-29 19:48:49

标签: r function for-loop

我有一个像这样的数据集:

 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分集的特定计算,因此每个索引的计算都不神秘。它们使用以下公式计算:

enter image description here

到目前为止,我已经为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))

1 个答案:

答案 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))