想象一下,我为这三个物种分配了9个采样记录:
sp1 sp2 sp3
3 1 5
我想要获得的是记录x种类矩阵,并用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
列数与物种数和具有记录数的行数相匹配。请注意,每行代表一个物种的唯一记录。
答案 0 :(得分:2)
使用rep
生成1
和dcast
来自reshape2
进行整形和填充。
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
答案 1 :(得分: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)
答案 2 :(得分:1)
另一种选择是创建行/列索引,使用sparseMatrix
中的library(Matrix)
来创建稀疏矩阵,可以使用{{转换回0 {1}} {1}} 1}}。
目前尚不清楚初始数据集是否为matrix
。假设它是一个带有3列和1行的as.matrix
,我们通过复制具有'm1'元素的列序列来获得列索引。如果它是matrix
,它也应该有用。对于matrix
,我们必须使用vector
。然后,创建data.frame
,将行索引指定为'cI'的序列,列索引('cI')和值'x'为1。
rep(seq_along(df1), unlist(df1))
sparseMatrix
方法是创建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
为0,然后用1替换与行/列索引对应的元素。
base R
matrix