Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从向量构造二元矩阵的更简洁方法_R_Matrix_Vector - Fatal编程技术网

R 从向量构造二元矩阵的更简洁方法

R 从向量构造二元矩阵的更简洁方法,r,matrix,vector,R,Matrix,Vector,我有一个有趣的挑战:我试图从整数向量构造一个二进制矩阵。二进制矩阵应包含与向量长度一样多的行,以及与整数向量中的最大值一样多的列。矩阵中的第i行将对应于向量的第i个元素,该行在位置j处包含1,其中j等于向量的第i个元素的值;否则,该行包含零。如果第i个整数的值为0,则整个第i行应为0 为了简化这一过程,这里有一个可重复使用的示例: set.seed(1) playv<-sample(0:5,20,replace=TRUE)#sample integer vector playmat<

我有一个有趣的挑战:我试图从整数向量构造一个二进制矩阵。二进制矩阵应包含与向量长度一样多的行,以及与整数向量中的最大值一样多的列。矩阵中的第i行将对应于向量的第i个元素,该行在位置j处包含1,其中j等于向量的第i个元素的值;否则,该行包含零。如果第i个整数的值为0,则整个第i行应为0

为了简化这一过程,这里有一个可重复使用的示例:

set.seed(1)
playv<-sample(0:5,20,replace=TRUE)#sample integer vector

playmat<-matrix(playv,nrow=length(playv),ncol=max(playv))#create matrix from vector

for (i in 1:length(playv)){
pos<-as.integer(playmat[i,1])
playmat[i,pos]<-1
playmat[i,-pos]<-0}

    head(playmat)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    1    0    0    0
[3,]    0    0    1    0    0
[4,]    0    0    0    0    1
[5,]    1    0    0    0    0
[6,]    0    0    0    0    1
set.seed(1)
普拉夫
model.matrix
table

Unit: seconds
  expr      min       lq   median       uq      max neval
 f1(v) 2.890084 3.147535 3.296186 3.377536 3.667843    10
 f2(v) 4.824832 5.625541 5.757534 5.918329 5.966332    10
model.matrix
table

Unit: seconds
  expr      min       lq   median       uq      max neval
 f1(v) 2.890084 3.147535 3.296186 3.377536 3.667843    10
 f2(v) 4.824832 5.625541 5.757534 5.918329 5.966332    10

当然,您也可以只使用

> table(sequence(length(playv)), playv)
    playv
     0 1 2 3 4 5
  1  0 1 0 0 0 0
  2  0 0 1 0 0 0
  3  0 0 0 1 0 0
  4  0 0 0 0 0 1
  5  0 1 0 0 0 0
  6  0 0 0 0 0 1
  7  0 0 0 0 0 1
  8  0 0 0 1 0 0
  9  0 0 0 1 0 0
  10 1 0 0 0 0 0
  11 0 1 0 0 0 0
  12 0 1 0 0 0 0
  13 0 0 0 0 1 0
  14 0 0 1 0 0 0
  15 0 0 0 0 1 0
  16 0 0 1 0 0 0
  17 0 0 0 0 1 0
  18 0 0 0 0 0 1
  19 0 0 1 0 0 0
  20 0 0 0 0 1 0

如果速度是一个问题,我会建议手动方法。首先,确定向量中的唯一值。第二,创建一个空矩阵来填充。第三,使用矩阵索引确定应填写为1的职位

像这样:

f3 <- function(vec) {
  U <- sort(unique(vec))
  M <- matrix(0, nrow = length(vec), 
              ncol = length(U), 
              dimnames = list(NULL, U))
  M[cbind(seq_len(length(vec)), match(vec, U))] <- 1L
  M
}

当然,您也可以只使用

> table(sequence(length(playv)), playv)
    playv
     0 1 2 3 4 5
  1  0 1 0 0 0 0
  2  0 0 1 0 0 0
  3  0 0 0 1 0 0
  4  0 0 0 0 0 1
  5  0 1 0 0 0 0
  6  0 0 0 0 0 1
  7  0 0 0 0 0 1
  8  0 0 0 1 0 0
  9  0 0 0 1 0 0
  10 1 0 0 0 0 0
  11 0 1 0 0 0 0
  12 0 1 0 0 0 0
  13 0 0 0 0 1 0
  14 0 0 1 0 0 0
  15 0 0 0 0 1 0
  16 0 0 1 0 0 0
  17 0 0 0 0 1 0
  18 0 0 0 0 0 1
  19 0 0 1 0 0 0
  20 0 0 0 0 1 0

如果速度是一个问题,我会建议手动方法。首先,确定向量中的唯一值。第二,创建一个空矩阵来填充。第三,使用矩阵索引确定应填写为1的职位

像这样:

f3 <- function(vec) {
  U <- sort(unique(vec))
  M <- matrix(0, nrow = length(vec), 
              ncol = length(U), 
              dimnames = list(NULL, U))
  M[cbind(seq_len(length(vec)), match(vec, U))] <- 1L
  M
}

你在找模型矩阵吗?
t(sapply(playv,函数(i){if(i!=0){c(rep(0,i-1),1,rep(0,max(playv)-i))}或者rep(0,max(playv))}或者你在找模型矩阵吗
google很难找到一个非常简单的解决方案。google很难找到一个非常简单的解决方案。很好的解决方案!但是比model.matrix稍微慢一点。我同意在这种情况下速度并不重要。但是,如果一个工作与大集,这可能会变得烦人。如果您能够超越
model.matrix
您可以提出您的解决方案,以替代
model.matrix
功能:杰出的我会根据需要使用它。:)很好的解决方案!但是比model.matrix稍微慢一点。我同意在这种情况下速度并不重要。但是,如果一个工作与大集,这可能会变得烦人。如果您能够超越
model.matrix
您可以提出您的解决方案,以替代
model.matrix
功能:杰出的我会根据需要使用它。:)