2017-06-16 25 views
0

我试图将捕获的可变数量物种('nuse')应用于多个不同数据集的辛普森多样性指数。因此,我正在尝试构建可以自动应对这些问题的代码,而不必每次都手动构建公式。手动公式的示例数据集如下:可变长度公式构建

diverse <- data.frame(nuse1=c(0,20,40,20), nuse2=c(5,5,3,20), nuse3=c(0,2,8,20), nuse4=c(5,8,2,20), total=c(10,35,53,80)) 

simp <- function(x) { 
    total <- x[,"total"] 
    nuse1 <- x[,"nuse1"] 
    nuse2 <- x[,"nuse2"] 
    nuse3 <- x[,"nuse3"] 
    nuse4 <- x[,"nuse4"] 

    div <- round(((1-(((nuse1*(nuse1 - 1)) + (nuse2*(nuse2 - 1)) + (nuse3*(nuse3 - 1)) + (nuse4*(nuse4 - 1)))/(total*(total - 1))))),digits=4) 
     return(div) 
     } 

diverse$Simpson <- simp(diverse) 
diverse 

正如你所见,这工作正常。但是,我如何能够创建一个功能,可以自动调整,例如,9种(到nuse9)?

我已经试验了粘贴功能+ as.formula,如Formula with dynamic number of variables所示;然而,这是我努力的(nuse1 *(nuse1 - 1))的扩展形式。有没有人有任何建议吗?谢谢。

回答

1

如何像:

diverse <- data.frame(nuse1=c(0,20,40,20), nuse2=c(5,5,3,20), nuse3=c(0,2,8,20), nuse4=c(5,8,2,20), total=c(10,35,53,80)) 

simp <- function(x, species) { 
    spcs <- grep(species, colnames(x)) # which column names have "nuse" 
    total <- rowSums(x[,spcs]) # sum by row 
    div <- round(1 - rowSums(apply(x[,spcs], 2, function(s) s*(s-1)))/(total*(total - 1)), digits = 4) 
    return(div) 
} 

diverse$Simpson2 <- simp(diverse, species = "nuse") 
diverse 

# nuse1 nuse2 nuse3 nuse4 total Simpson2 
# 1  0  5  0  5 10 0.5556 
# 2 20  5  2  8 35 0.6151 
# 3 40  3  8  2 53 0.4107 
# 4 20 20 20 20 80 0.7595 

它所做的就是找出哪些列开始与“n使用”或任何其他物种在你的数据集有。它构造函数中的“总数”值,并且不需要数据集中的总列数。

+0

完美地工作 - 谢谢! –