我正在尝试在 R 中创建以下类型的矩阵:行数等于 n(提供);在第 i 行中,对于所有 i=1:n,在位置 n(i-1)+1 到 n(i-1)+n(含)处的1元素是 ,所有其他元素都是0。例如,如果 n=3,矩阵看起来像
1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1
Run Code Online (Sandbox Code Playgroud)
或者对于 n=4:
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
有没有办法在 R 中构造这个矩阵,对于一般 n,而不使用for循环(或任何其他类型的循环最好)?
最简单/最有效的方法(在基础 R 中)将是理想的。
解决方案 1:diag返回矩阵的对角线。重复each元素 3 次并(重新)将其强制转换为矩阵:
matrix(rep(diag(3), each=3), nrow=3, byrow=TRUE)
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#> [1,] 1 1 1 0 0 0 0 0 0
#> [2,] 0 0 0 1 1 1 0 0 0
#> [3,] 0 0 0 0 0 0 1 1 1
Run Code Online (Sandbox Code Playgroud)
解决方案2:table将两个向量解释为因子并计算它们的水平组合。由于每个组合只存在一次,你会得到相同的结果:
table(rep(1:3, each = 3), 1:9)
#>
#> 1 2 3 4 5 6 7 8 9
#> 1 1 1 1 0 0 0 0 0 0
#> 2 0 0 0 1 1 1 0 0 0
#> 3 0 0 0 0 0 0 1 1 1
Run Code Online (Sandbox Code Playgroud)
由reprex 包(v1.0.0)于2021年 2 月 21 日创建
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |