【问题标题】:Calculating diversity indices across sites in R计算R中跨站点的多样性指数
【发布时间】:2017-02-14 11:19:47
【问题描述】:

我有一个数据框(df)如下:

Year PlotNo HabitatType Sp1 Sp2 Sp3 Sp4
2000   1       GH        0   1   2   3
1988   3       KL        2   3   4   5

其中,Sp 代表物种,其列代表丰度值。

我正在尝试为数据框中的每一行查找 Simpson 的多样性。我尝试了以下 for 循环:

require(vegan)
y <- for(i in 1:nrow(df)) {
row <- df[i,4:50] #Assuming 50 columns
diversity(row, "simp")
}

但是,我一直遇到如下错误:

sum(x) 中的错误:参数的“类型”(字符)无效

关于如何纠正此错误的任何想法?或者有什么替代方法?

【问题讨论】:

  • 附带说明:不要调用 data.frame df。这是 R 中函数的名称,如果出现语法错误,会导致混乱的错误消息。
  • 你能让你的例子可重现吗?没有它,我们只能猜测到底出了什么问题。

标签: r for-loop vegan


【解决方案1】:

diversity 确实需要数值数据,这可能是你的问题。你从sum(df[,4:50]) 得到什么?

另一个问题是您不需要for() 循环:当给定数据框或矩阵时,diversity 将计算每一行的索引(如果您设置参数MARGIN = 2,则为每一列)。所以diversity(df[,4:50]) 应该这样做,前提是您的数据是数字的。

【讨论】:

  • 啊哈,我没有意识到这一点。我想我必须在每一行循环多样性才能得到结果。解决了!
【解决方案2】:

diversity 函数只能处理数值数据。 df[i,4:50] 可能包含非数字元素。我的猜测是某些列是characterfactor。但是,如果没有可重现的示例,我无法确认是这种情况。

【讨论】:

  • 我使用 str(df) 进行了检查。 year 和 plot_id 是 int,plot_type 是一个因子,其余列是 num,应该是这样。当我做摘要(df)时,从 4:50 开始的所有列都有一个平均值/中位数等。此外,我现在只在 4:7 之间查看,输出显示为 NULL
  • 原始命令的输出将始终为NULL,因为您有y &lt;- for() {}for()returns NULL。如果要在循环中收集结果,则必须在循环内进行赋值:y &lt;- numeric(nrow(df)); for(i in 1:nrow(df)) {...; y[i] &lt;- diversity(row, "simp")}。但是,使用diversity,您不需要for()
【解决方案3】:

我们可以使用:

library(data.table)
mydf <- setDF(mydf)
res <- mydf[, div := diversity(mydf[, 4:7], 'simp')]

这会为每一行添加一个列 divdiversity 函数的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2021-11-17
    相关资源
    最近更新 更多