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

时间:2015-08-19 14:36:31

标签: r reshape2

想象一下,我为这三个物种分配了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

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

3 个答案:

答案 0 :(得分:2)

使用rep生成1dcast来自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)

以下是使用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) 

答案 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