我有單位矩陣,可以通過 diag(5)
[,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 1 0
[5,] 0 0 0 0 1
我想將它轉換為矩陣,其中系列在 1 之后開始。例如,第一列,值 1 到 5。第二列 - 值 1 到 4。
期望輸出
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 2 1 0 0 0
[3,] 3 2 1 0 0
[4,] 4 3 2 1 0
[5,] 5 4 3 2 1
uj5u.com熱心網友回復:
試試下面的代碼(給定m <- diag(5))
> (row(m) - col(m) 1)*lower.tri(m,diag = TRUE)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 2 1 0 0 0
[3,] 3 2 1 0 0
[4,] 4 3 2 1 0
[5,] 5 4 3 2 1
另一種選擇是使用apply cumsum
> apply(lower.tri(m, diag = TRUE), 2, cumsum)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 2 1 0 0 0
[3,] 3 2 1 0 0
[4,] 4 3 2 1 0
[5,] 5 4 3 2 1
uj5u.com熱心網友回復:
基于嵌套的解決方案cumsum:
n <- 5
m <- diag(n)
apply(m, 2, function(x) cumsum(cumsum(x)))
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 0 0 0 0
#> [2,] 2 1 0 0 0
#> [3,] 3 2 1 0 0
#> [4,] 4 3 2 1 0
#> [5,] 5 4 3 2 1
uj5u.com熱心網友回復:
一種選擇可能是:
x <- 1:5
embed(c(rep(0, length(x) - 1), x), length(x))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 2 1 0 0 0
[3,] 3 2 1 0 0
[4,] 4 3 2 1 0
[5,] 5 4 3 2 1
uj5u.com熱心網友回復:
1)如果 d <- diag(5) 是單位矩陣,則:
pmax(row(d) - col(d) 1, 0)
給予:
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 2 1 0 0 0
[3,] 3 2 1 0 0
[4,] 4 3 2 1 0
[5,] 5 4 3 2 1
2)這個替代方案稍長(盡管仍然是單行),但如果 d 的列重新排列和/或某些列丟失,也可以使用。例如,
dd <- d[, 4:1] # test data
pmax(outer(1:nrow(dd) 1, max.col(t(dd)), `-`), 0)
為 d 和 dd 給出相同的結果:
[,1] [,2] [,3] [,4]
[1,] 0 0 0 1
[2,] 0 0 1 2
[3,] 0 1 2 3
[4,] 1 2 3 4
[5,] 2 3 4 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/391174.html
上一篇:如何為R代碼輸入新條件
下一篇:將多個NA行添加到資料框中
