首页 > 解决方案 > 如何在R中的一个变量的条件下创建新矩阵?

问题描述

我有一个 长度x 变量20

x
 [1] 3 3 1 2 3 1 2 1 3 1 3 1 3 2 1 1 3 1 3 2.

现在我想创建一个顺序矩阵,20 by 2 其中第一列 W_i11ifx==1-1if填充x not equal to 1。同样,第二列用1ifx=2-1if填充x not equal to 2。如果x=3,则两列都由 填充-1。这是预期的结果

W_ij
      [,1] [,2]
 [1,]   -1   -1
 [2,]   -1   -1
 [3,]    1   -1
 [4,]   -1    1
 [5,]   -1   -1
 [6,]    1   -1
 [7,]   -1    1
 [8,]    1   -1
 [9,]   -1   -1
[10,]    1   -1
[11,]   -1   -1
[12,]    1   -1
[13,]   -1   -1
[14,]   -1    1
[15,]    1   -1
[16,]    1   -1
[17,]   -1   -1
[18,]    1   -1
[19,]   -1   -1
[20,]   -1    1

我可以分别为每一列做它并记录为一个矩阵

W_i1=ifelse(x==1,1,-1)
W_i2=ifelse(x==2,1,-1)
W_ij=matrix(c(W_i1,W_i2),
             nrow = 20,
             ncol =2,
             byrow = F)

我可以使用任何循环吗?

任何帮助表示赞赏?

标签: rfor-loopmatrix

解决方案


我们可以一步完成

replace(cbind( c(-1, 1)[(x==1) + 1], c(-1, 1)[(x==2) + 1] ), x == 3, -1)
#      [,1] [,2]
# [1,]   -1   -1
# [2,]   -1   -1
# [3,]    1   -1
# [4,]   -1    1
# [5,]   -1   -1
# [6,]    1   -1
# [7,]   -1    1
# [8,]    1   -1
# [9,]   -1   -1
#[10,]    1   -1
#[11,]   -1   -1
#[12,]    1   -1
#[13,]   -1   -1
#[14,]   -1    1
#[15,]    1   -1
#[16,]    1   -1
#[17,]   -1   -1
#[18,]    1   -1
#[19,]   -1   -1
#[20,]   -1    1

由于有些步骤类似,可以创建一个函数

f1 <- function(vec, v) c(-1, 1)[(vec == v) + 1]
replace(cbind(f1(x, 1), f1(x, 2)), x == 3, -1)

数据

x <- c(3, 3, 1, 2, 3, 1, 2, 1, 3, 1, 3, 1, 3, 2, 1, 1, 3, 1, 3, 2)

推荐阅读