将每个物种的总记录转换为记录 x 物种矩阵

Convert total records per species into record x species matrix

假设我有三个物种的 9 个采样记录,分布如下:

sp1 sp2 sp3
3 1 5

我要得到的是一个records x species矩阵,然后用1和0填充:

sp1 sp2 sp3 
1 0 0
1 0 0
1 0 0
0 1 0
0 0 1
0 0 1
0 0 1
0 0 1
0 0 1

列数与物种数匹配,行数与记录数匹配。请注意,每一行代表一个物种的唯一记录。

使用 rep 生成 1 并使用 reshape2 生成 dcast 形状和填充。

library(reshape2)
x<-list(sp1=3,sp2=1,sp3=5)
d<-melt(lapply(x,function(i) rep(1,i)))
dcast(d,1:nrow(d)~L1,fill=0)[-1]
  sp1 sp2 sp3
1   1   0   0
2   1   0   0
3   1   0   0
4   0   1   0
5   0   0   1
6   0   0   1
7   0   0   1
8   0   0   1
9   0   0   1

这是另一个使用 stackspread

的选项
library(tidyr)

stackedList = stack(apply(df, 2, function(x) rep(1, x)))
out = spread(stackedList, ind, values, fill = 0)

#> out
#  sp1 sp2 sp3
#1   1   0   0
#2   1   0   0
#3   1   0   0
#4   0   1   0
#5   0   0   1
#6   0   0   1
#7   0   0   1
#8   0   0   1
#9   0   0   1

数据

df = data.frame(sp1 = 3, sp2 = 1, sp3 = 5) 

另一种选择是创建 row/column 索引,使用 sparseMatrixlibrary(Matrix) 创建一个稀疏矩阵,它可以转换回 matrix of 0 和1s as.matrix.

不清楚初始数据集是否matrix。假设是一个3列1行的matrix,我们通过复制'm1'的元素的列序列得到列索引。如果它是 vector,它也应该有效。对于 data.frame,我们必须使用 rep(seq_along(df1), unlist(df1))。然后,创建 sparseMatrix,指定行索引为 'cI' 的序列,列索引 ('cI') 和值 'x' 为 1.

library(Matrix)
cI <- rep(seq_along(m1), m1)
m2 <- as.matrix(sparseMatrix(seq_along(cI), cI, x=1))
colnames(m2) <- colnames(m1)
m2
#      sp1 sp2 sp3
# [1,]   1   0   0
# [2,]   1   0   0
# [3,]   1   0   0
# [4,]   0   1   0
# [5,]   0   0   1
# [6,]   0   0   1
# [7,]   0   0   1
# [8,]   0   0   1
# [9,]   0   0   1

base R 方法是创建一个 matrix 的 0,然后用 1 替换对应于 row/column 索引的元素。

m2 <- matrix(0, nrow=length(cI), ncol=ncol(m1),
                   dimnames=list(NULL, colnames(m1))) 
m2[cbind(seq_along(cI), cI)] <- 1
m2
#      sp1 sp2 sp3
# [1,]   1   0   0
# [2,]   1   0   0
# [3,]   1   0   0
# [4,]   0   1   0
# [5,]   0   0   1
# [6,]   0   0   1
# [7,]   0   0   1
# [8,]   0   0   1
# [9,]   0   0   1

数据

m1 <- structure(c(3L, 1L, 5L), .Dim = c(1L, 3L), .Dimnames = list(NULL, 
c("sp1", "sp2", "sp3")))