R 如何通过物种矩阵显示场地中的植物物种生物量?

R 如何通过物种矩阵显示场地中的植物物种生物量?,r,matrix,multi-dimensional-scaling,R,Matrix,Multi Dimensional Scaling,我之前问过“如何将两列显示为二进制(存在/不存在)矩阵?”。这个问题得到了两个极好的答案。我现在想更进一步,在原址上添加第三列,按物种列,反映每个地块中每个物种的生物量 第1列(地块)指定约200个地块的代码,第2列(物种)指定约1200个物种的代码,第3列(生物量)指定干重。每个地块有>1个物种,每个物种可以出现在>1个地块中。总行数约为2700行 > head(dissim) plot species biomass 1 a1f56r jactom 20.2 2 a1f56r

我之前问过“如何将两列显示为二进制(存在/不存在)矩阵?”。这个问题得到了两个极好的答案。我现在想更进一步,在原址上添加第三列,按物种列,反映每个地块中每个物种的生物量

第1列(地块)指定约200个地块的代码,第2列(物种)指定约1200个物种的代码,第3列(生物量)指定干重。每个地块有>1个物种,每个物种可以出现在>1个地块中。总行数约为2700行

> head(dissim)
    plot species biomass
1 a1f56r  jactom 20.2
2 a1f56r  zinunk 10.3
3 a1f56r  mikcor 0.4
4 a1f56r  rubcle 1.3
5 a1f56r  sphoos 12.4
6 a1f56r nepbis1 8.2

tail(dissim)
           plot species biomass
2707 og100m562r  selcup 4.7
2708 og100m562r  pip139 30.5
2709 og100m562r  stasum 0.1
2710 og100m562r  artani 3.4
2711 og100m562r  annunk 20.7
2712 og100m562r  rubunk 22.6
我想创建一个逐物种矩阵,显示每个地块中每个物种的生物量(而不是二元存在/不存在矩阵),形式如下:

    jactom  rubcle  chrodo  uncgla
a1f56r  1.3 0   10.3    0
a1f17r  0   22.3    0   4
a1m5r   3.2 0   3.7 9.7
a1m5r   1   0   0   20.1
a1m17r  5.4 6.9 0   1
如果您能就如何增加这种额外的复杂性提供任何建议,我们将不胜感激。

示例数据

set.seed(15)
dd<-data.frame(
    a=sample(letters[1:5], 30, replace=T),
    b=sample(letters[6:10], 30, replace=T)
)
如果它们可能重复,并且您只想跟踪存在/不存在,您可以这样做

with(dd, table(a,b))

#    b
# a   f g h i j
#   a 0 1 0 2 3
#   b 0 0 2 1 0
#   c 0 3 0 0 1
#   d 2 2 2 1 1
#   e 1 1 2 4 1
with(unique(dd), table(a,b))
# or 
with(dd, (table(a,b)>0)+0)

#    b
# a   f g h i j
#   a 0 1 0 1 1
#   b 0 0 1 1 0
#   c 0 1 0 0 1
#   d 1 1 1 1 1
#   e 1 1 1 1 1

xtabs和tapply函数返回一个矩阵表格:

# Using MrFlick's example
> xtabs(~a+b,dd)
   b
a   f g h i j
  a 0 1 0 2 3
  b 0 0 2 1 0
  c 0 3 0 0 1
  d 2 2 2 1 1
  e 1 1 2 4 1

# --- the tapply solution is a bit less elegant
> dd$one=1
> with(dd, tapply(one, list(a,b), sum))
   f  g  h  i  j
a NA  1 NA  2  3
b NA NA  2  1 NA
c NA  3 NA NA  1
d  2  2  2  1  1
e  1  1  2  4  1

# If you want to make the NA's become zeros then:

> tbl <- with(dd, tapply(one, list(a,b), sum))
> tbl[is.na(tbl)] <- 0
> tbl
  f g h i j
a 0 1 0 2 3
b 0 0 2 1 0
c 0 3 0 0 1
d 2 2 2 1 1
e 1 1 2 4 1
#使用MrFlick的例子
>xtabs(~a+b,dd)
B
a f g h i j
零一零二三
b 0 0 2 1 0
C03001
D2211
E1241
#---tapply解决方案有点不优雅
>dd$1=1
>带(dd,tapply(一个,列表(a,b),总和))
f g h i j
a NA 1 NA 2 3
b NA NA 2 1 NA
c-na3-na1
D2211
E1241
#如果要使NA变为零,则:
>tbl tbl[is.na(tbl)]tbl
f g h i j
零一零二三
b 0 0 2 1 0
C03001
D2211
E1241

当有三个变量时,您还询问了解决方案。下面我提供了您要求的两个解决方案

首先,让我们设置数据数据:

set.seed(15)
dd<-data.frame(
  a=sample(letters[1:5], 30, replace=T),
  b=sample(letters[6:10], 30, replace=T),
  c=sample(letters[1:3], 30, replace=T)
)
如果需要第三个变量的平均值,可以使用:


这两个答案都是非常有用的。使用:<代码>重塑::演员(DISSIM,情节~~种,价值=‘生物量’,乐趣=平均值)< /C>。但是,在这种情况下,搜索存档就足够了。对于按物种划分的2列站点表,是否有一个替代选项在3列表上使用with()和table()?matrixBiom是的,但只计算数量,不计算收入。这很有效,谢谢。然而,在矩阵上使用函数metaMDS执行NMDS的下一步会产生错误消息,因此我在@tabtimm take a tour()上发布了一个额外的问题,说明如何执行此操作-这将有助于充分利用站点和社区。如果你发现某个答案有帮助或误导性,记得投赞成票或反对票;如果你发现某个答案回答了你的问题,记得接受该答案,这样别人就知道问题已经解决了。
by(dd, dd$c, function(x) with(x, table(a, b)))
reshape::cast(dd, a ~ b, value = 'c', fun = mean)