【问题标题】:Perform multiple functions on each row of matrix and append results to new dataframe对矩阵的每一行执行多个函数并将结果附加到新的数据帧
【发布时间】:2017-06-09 20:02:14
【问题描述】:

我有一个矩阵。示例数据:

 matrix<- matrix(sample(1:10), nrow= 10,ncol=20)

注意:在我的真实矩阵中,行名是绘图编号,对于保持与该行的值相关联很重要。

我想在矩阵的每一行上执行各种功能(vegan 包中的多样性功能)。功能包括:

library(vegan)
div1<- diversity(matrix, index="shannon")
div2<- diversity(matrix, index="simpson")
div3<- exp(diversity(matrix,index="shannon"))
div4<- 1/(1-diversity(matrix,index="simpson"))
spec.num<- specnumber(matrix) 

输出应该是一个数据框。该数据框的每一列代表唯一的多样性指数。输出如下所示:

Rownames     div1        div2    div3  div4     spec.num   
  Plot1     2.995732    0.95    20     20         20
  Plot34    2.995732    0.95    20     20         20
  Plot56    2.995732    0.95    20     20         20
  Plot60    2.995732    0.95    20     20         20

注意:对于我的真实数据,矩阵行的每一列都有唯一的值,如我的示例所示,它们不会重复。因此,div3,div4,spec number 的输出不一定与此示例输出中显示的值相同。

【问题讨论】:

    标签: r matrix


    【解决方案1】:
    library(vegan)
    
    matrix<- matrix(sample(1:10), nrow= 10,ncol=20)
    #rownames(matrix) <- paste0("plot", 1:nrow(matrix)) ## this is/was merely an illustration on carrying rownames forward
    
    df <- data.frame(div1=diversity(matrix, index="shannon"), div2=diversity(matrix, index="simpson"), 
          div3=exp(diversity(matrix,index="shannon")), div4=1/(1-diversity(matrix,index="simpson")), spec.nu=specnumber(matrix), row.names = rownames(matrix))
    

    【讨论】:

    • rownames 如果您的矩阵已经有行名,则不需要调用(这是为了说明保留行名)。或者,如果您的“行名”在第 1 列中,请将 row.names = rownames(matrix) 更改为 row.names = matrix[, 1]
    • 现在我意识到我的问题并不像我第一次问的那么复杂,而且您的解决方案非常干净而且很有帮助。我遇到的唯一问题(我相信它源于 1:nrow(matrix) 使用 rownames 函数)是我的情节编号不是从 1 到 100 顺序排列的。例如,我必须从原始数据框中删除一些图,以便矩阵从图 85 跳到图 88。当我在我的数据上使用您的代码时,它似乎按顺序编号地块,从而重新分配地块编号。因此,当需要保留地块 88 时,地块 88 被重新编号为地块 86。
    • 请看我的编辑。你不需要rownames(matrix) &lt;- paste0("plot", 1:nrow(matrix)) 所以我已经注释掉了。
    【解决方案2】:

    您只是想对结果进行列绑定吗?

    # if you set your sampling range to be 1:1000 these diversity values are no longer constant
    mtx <- matrix(sample(1:1000), nrow= 10,ncol=20) # I like to avoid like names
    #install.packages("vegan")
    library(vegan)
    div1<- diversity(mtx, index="shannon")
    div2<- diversity(mtx, index="simpson")
    div3<- exp(diversity(mtx,index="shannon"))
    div4<- 1/(1-diversity(mtx,index="simpson"))
    spec.num<- specnumber(mtx) 
    cbind(div1, div2, div3, div4, spec.num) # cbinding equal length vectors into a data.frame/matrix 
    #cbind.data.frame()
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2021-10-14
      • 1970-01-01
      • 2013-11-18
      • 2014-01-07
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多