使用apply函数并选择行

时间:2013-02-13 11:09:07

标签: r apply

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

我有115种树木和6264种树木

  

头(ESP)

         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),]
}

但是效果并不好。

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

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

谢谢

1 个答案:

答案 0 :(得分: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(非A数)元素显然是由于某些图的总物种数为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