将每个物种的总记录转换为记录 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
这是另一个使用 stack
和 spread
的选项
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 索引,使用 sparseMatrix
从 library(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")))
假设我有三个物种的 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
这是另一个使用 stack
和 spread
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 索引,使用 sparseMatrix
从 library(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")))