我之前问过"如何将两列显示为二进制(存在/不存在)矩阵?"。这个问题得到了两个很好的答案我现在想更进一步,通过物种列在原始位点添加第三列,反映每个图中每个物种的生物量。
第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
非常感谢任何关于如何增加这种额外复杂程度的建议。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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)))
如果您想要第三个变量的平均值,可以使用this solution:
reshape::cast(dd, a ~ b, value = 'c', fun = mean)