在 R 中计算跨站点的多样性指数
Calculating diversity indices across sites in R
我有一个数据框(df)如下:
Year PlotNo HabitatType Sp1 Sp2 Sp3 Sp4
2000 1 GH 0 1 2 3
1988 3 KL 2 3 4 5
其中,Sp
代表物种,其列代表丰度值。
我试图找出数据框中每一行的辛普森多样性。我尝试了以下 for 循环:
require(vegan)
y <- for(i in 1:nrow(df)) {
row <- df[i,4:50] #Assuming 50 columns
diversity(row, "simp")
}
但是我存运行 报如下错误:
Error in sum(x) : invalid 'type' (character) of argument
关于如何更正此错误的任何想法?或者有任何替代方法吗?
diversity
函数只能处理数值数据。可能 df[i,4:50]
包含 non-numeric 个元素。我的猜测是某些列是 character
或 factor
。但是,如果没有可重现的示例,我无法确认情况是否如此。
我们可以使用:
library(data.table)
mydf <- setDF(mydf)
res <- mydf[, div := diversity(mydf[, 4:7], 'simp')]
这会为每一行添加一个列 div
,其中包含 diversity
函数的结果。
diversity
确实需要数值数据,这可能是你的问题。你从 sum(df[,4:50])
得到了什么?
另一个问题是您不需要 for()
循环:当给定数据框或矩阵时,diversity
将计算每行(或列,如果您设置参数 MARGIN = 2
).所以 diversity(df[,4:50])
应该可以,前提是您的数据是数字。
我有一个数据框(df)如下:
Year PlotNo HabitatType Sp1 Sp2 Sp3 Sp4
2000 1 GH 0 1 2 3
1988 3 KL 2 3 4 5
其中,Sp
代表物种,其列代表丰度值。
我试图找出数据框中每一行的辛普森多样性。我尝试了以下 for 循环:
require(vegan)
y <- for(i in 1:nrow(df)) {
row <- df[i,4:50] #Assuming 50 columns
diversity(row, "simp")
}
但是我存运行 报如下错误:
Error in sum(x) : invalid 'type' (character) of argument
关于如何更正此错误的任何想法?或者有任何替代方法吗?
diversity
函数只能处理数值数据。可能 df[i,4:50]
包含 non-numeric 个元素。我的猜测是某些列是 character
或 factor
。但是,如果没有可重现的示例,我无法确认情况是否如此。
我们可以使用:
library(data.table)
mydf <- setDF(mydf)
res <- mydf[, div := diversity(mydf[, 4:7], 'simp')]
这会为每一行添加一个列 div
,其中包含 diversity
函数的结果。
diversity
确实需要数值数据,这可能是你的问题。你从 sum(df[,4:50])
得到了什么?
另一个问题是您不需要 for()
循环:当给定数据框或矩阵时,diversity
将计算每行(或列,如果您设置参数 MARGIN = 2
).所以 diversity(df[,4:50])
应该可以,前提是您的数据是数字。