条件序列重复在R中

时间:2017-06-06 07:26:28

标签: r matrix

我有一个由1到6之间的很长的一系列整数组成的矩阵。我想创建一个长度与原始矩阵相同的输出矩阵和6列(原始矩阵中的最大值) 1是在整数值的列中第一次遇到的整数的值重复n次。 (即,如果第一个值为6,它将在输出矩阵的第6列中重复1 x 6次,然后原始矩阵的第7行中的值将用于下一个重复序列。我已经显示了一个示例以下。在R中有没有一种有效的方法呢?

Original Matrix         output  Matrix                      
    c1          c1  c2  c3  c4  c5  c6
R1  1       R1  1   0   0   0   0   0
R2  1       R2  1   0   0   0   0   0
R3  3       R3  0   0   1   0   0   0
R4  2       R4  0   0   1   0   0   0
R5  6       R5  0   0   1   0   0   0
R6  1       R6  1   0   0   0   0   0
R7  1       R7  1   0   0   0   0   0
R8  1       R8  1   0   0   0   0   0
R9  1       R9  1   0   0   0   0   0
R10 4       R10 0   0   0   1   0   0
R11 4       R11 0   0   0   1   0   0
R12 2       R12 0   0   0   1   0   0
R13 1       R13 0   0   0   1   0   0
R14 3       R14 0   0   1   0   0   0
R15 1       R15 0   0   1   0   0   0

输入输出矩阵的另一个例子,使我上面的例子更清晰。

Input matrix            Output matrix                                                           
    c1          1   2   3   4   5   6
1   2       1   0   1   0   0   0   0
2   2       2   0   1   0   0   0   0
3   1       3   1   0   0   0   0   0
4   6       4   0   0   0   0   0   1
5   3       5   0   0   0   0   0   1
6   4       6   0   0   0   0   0   1
7   5       7   0   0   0   0   0   1
8   4       8   0   0   0   0   0   1
9   5       9   0   0   0   0   0   1
10  4       10  0   0   0   1   0   0
11  3       11  0   0   0   1   0   0
12  3       12  0   0   0   1   0   0
13  2       13  0   0   0   1   0   0
14  3       14  0   0   1   0   0   0
15  4       15  0   0   1   0   0   0
16  5       16  0   0   1   0   0   0
17  5       17  0   0   0   0   1   0
18  5       18  0   0   0   0   1   0

1 个答案:

答案 0 :(得分:1)

这是一个简单的解决方案,但它有效:

input_data <- c(1, 1, 3, 2, 6, 1, 1, 1, 1, 4, 4, 2, 1, 3, 1)
result <- matrix(0, nrow = length(input_data), ncol = 6)

counter <- 0
for (i in 1:length(input_data)){
  if (counter == 0){
      counter <- set_value <- input_data[i]              
  }

  result[i, set_value]  <- 1
  counter <- counter - 1

}

> cbind(input_data, result)

 [1,]          1 1 0 0 0 0 0
 [2,]          1 1 0 0 0 0 0
 [3,]          3 0 0 1 0 0 0
 [4,]          2 0 0 1 0 0 0
 [5,]          6 0 0 1 0 0 0
 [6,]          1 1 0 0 0 0 0
 [7,]          1 1 0 0 0 0 0
 [8,]          1 1 0 0 0 0 0
 [9,]          1 1 0 0 0 0 0
[10,]          4 0 0 0 1 0 0
[11,]          4 0 0 0 1 0 0
[12,]          2 0 0 0 1 0 0
[13,]          1 0 0 0 1 0 0
[14,]          3 0 0 1 0 0 0
[15,]          1 0 0 1 0 0 0