0

我有一个数据框,显示每个物种(列)的每个地块(线)的树木数量。

我有 115 种树木在列和 6264 个地块

头(特别是)

         02 03 04 05 06 07 08S 09 10 11 12P 12V 13B 13C 13G 14 15P 15S 16 17C
  600005  0  0  0  0  0  0   0  0 16  0   0   0   0   0   0  0   0  32  0   0
  600008  0  0  0  0  0  0   0  0  0  0   0   8   0   0   0  0   0   0  0   5
  600012  0  0  0  0  0  0   0  0  0  0   0   0   0   0   0  0   0   0  0   0
  600030  3  0  0  5  0  0   0  0  0  0   0   0   0   0   0  0   0   0  0   0
  600033  0  0  0  0  0  0   0  0  0  0   0   0   0   0   0  0   0   0  0   0
  600035  0  0  0  1  0  0   0  0  0  0   0   0   0   0   0  0   0   0  0   0

我正在尝试计算每个地块中每种物种的比例。我试图这样做:

apply(esp,c(1,2), function(x){ifelse(x>0, x/sum(x)*100,0)})

我想要的是一个数据框,其中不同的图为线,物种的比例为列。

感谢您的帮助。

我回来只是为了一个愚蠢的问题:现在我的数据框包含每个地块中每个物种的比例,我想选择所有具有超过 80% 的一个物种的“纯”地块。

我知道如何为一个物种选择行:

pur<-prop[which(prop[,1]>80),]

这行得通,给了我想要的东西,但是由于我有 115 列,我尝试使用循环来完成它:

for (i in 1:115){
prop[which(prop[,i]>80),]
}

但效果并不好。

我也尝试过应用,但 which() 不是一个函数,所以它也不起作用。

apply(prop,2,which(prop[,1]>80))

谢谢

4

1 回答 1

0

这是你要找的吗?

esp/rowSums(esp)

         X02 X03 X04   X05 X06 X07 X08S X09       X10 X11 X12P      X12V
600005 0.000   0   0 0.000   0   0    0   0 0.3333333   0    0 0.0000000
600008 0.000   0   0 0.000   0   0    0   0 0.0000000   0    0 0.6153846
600012   NaN NaN NaN   NaN NaN NaN  NaN NaN       NaN NaN  NaN       NaN
600030 0.375   0   0 0.625   0   0    0   0 0.0000000   0    0 0.0000000
600033   NaN NaN NaN   NaN NaN NaN  NaN NaN       NaN NaN  NaN       NaN
600035 0.000   0   0 1.000   0   0    0   0 0.0000000   0    0 0.0000000
       X13B X13C X13G X14 X15P      X15S X16      X17C
600005    0    0    0   0    0 0.6666667   0 0.0000000
600008    0    0    0   0    0 0.0000000   0 0.3846154
600012  NaN  NaN  NaN NaN  NaN       NaN NaN       NaN
600030    0    0    0   0    0 0.0000000   0 0.0000000
600033  NaN  NaN  NaN NaN  NaN       NaN NaN       NaN
600035    0    0    0   0    0 0.0000000   0 0.0000000

结果中的NaN(Not A Number) 元素显然是由于某些地块的物种总数为 0,从而导致除以零。如果您愿意,可以将这些值替换为其他值,例如:

res <- esp/rowSums(esp)
res <- sapply(res, function(v) {
  v[is.nan(v)] <- 0
  return(v)
})
round(res,2)

       X02 X03 X04  X05 X06 X07 X08S X09  X10 X11 X12P X12V X13B X13C X13G
[1,] 0.00   0   0 0.00   0   0    0   0 0.33   0    0 0.00    0    0    0
[2,] 0.00   0   0 0.00   0   0    0   0 0.00   0    0 0.62    0    0    0
[3,] 0.00   0   0 0.00   0   0    0   0 0.00   0    0 0.00    0    0    0
[4,] 0.38   0   0 0.62   0   0    0   0 0.00   0    0 0.00    0    0    0
[5,] 0.00   0   0 0.00   0   0    0   0 0.00   0    0 0.00    0    0    0
[6,] 0.00   0   0 1.00   0   0    0   0 0.00   0    0 0.00    0    0    0
     X14 X15P X15S X16 X17C
[1,]   0    0 0.67   0 0.00
[2,]   0    0 0.00   0 0.38
[3,]   0    0 0.00   0 0.00
[4,]   0    0 0.00   0 0.00
[5,]   0    0 0.00   0 0.00
[6,]   0    0 0.00   0 0.00
于 2013-02-13T11:14:49.533 回答