0

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

第 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

任何关于如何增加这种额外复杂程度的建议都将不胜感激。

4

3 回答 3

4

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
于 2014-12-06T03:05:34.183 回答
4

有样本数据

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
于 2014-12-06T02:49:50.277 回答
1

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

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

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)
)

如果您有三个离散变量并且只想计算出现次数,那么您可以在这里获得@MrFlick 的解决方案版本:

by(dd, dd$c, function(x) with(x, table(a, b)))

如果你想要第三个变量的平均值,你可以使用这个解决方案

reshape::cast(dd, a ~ b, value = 'c', fun = mean)
于 2014-12-09T18:12:51.337 回答