我怎麼會去轉換樹列表進行反向下三角矩陣R中
m = list(1,2:3,4:6,7:10)
到
[,1] [,2] [,3] [,4]
[1,] 0 0 0 10
[2,] 0 0 6 9
[3,] 0 3 5 8
[4,] 1 2 4 7
一個想法或一些指導的讚賞!感謝您的耐心,以防問題太幼稚或需要更多信息(我會很樂意提供)。
我怎麼會去轉換樹列表進行反向下三角矩陣R中
m = list(1,2:3,4:6,7:10)
到
[,1] [,2] [,3] [,4]
[1,] 0 0 0 10
[2,] 0 0 6 9
[3,] 0 3 5 8
[4,] 1 2 4 7
一個想法或一些指導的讚賞!感謝您的耐心,以防問題太幼稚或需要更多信息(我會很樂意提供)。
1)下方lapply
追加n
零到的m
各組分和sapply
需要的m
各成分的第一n
元件重塑結果成一個矩陣。最後,我們顛倒結果矩陣的行的順序。這個工程即使m
沒有定義一個三角矩陣:
n <- length(m)
sapply(lapply(m, c, numeric(n)), head, n)[n:1, ]
,並提供:
[,1] [,2] [,3] [,4]
[1,] 0 0 0 10
[2,] 0 0 6 9
[3,] 0 3 5 8
[4,] 1 2 4 7
如果n
可以爲零,然後代替n:1
使用rev(seq_len(n))
。
2)一個簡單的sapply
也適用。它預先考慮的m
每個扭轉組件與零的適當數量和重塑成一個矩陣:
sapply(m, function(v) c(numeric(n - length(v)), rev(v)))
不適卡盤的基R法向前
# Create matrix with dimensions defined by the length of your list
mat <- matrix(0, length(m), length(m))
# Fill in desired order
mat[upper.tri(mat, TRUE)] <- unlist(m)
# Order rows
mat[length(m):1, ]
這裏還有一個值得考慮的選擇。這使用lengths
來確定最長向量的長度,然後使用vapply
,該自動簡化爲矩陣(如sapply
,但更快)。
len <- max(lengths(m)) ## What's the longest vector in m?
vapply(m, function(x) {
length(x) <- len ## Make all vectors the same length
rev(replace(x, is.na(x), 0)) ## Replace NA with 0 and reverse
}, numeric(len))
# [,1] [,2] [,3] [,4]
# [1,] 0 0 0 10
# [2,] 0 0 6 9
# [3,] 0 3 5 8
# [4,] 1 2 4 7
如果使用稀疏矩陣(從Matrix
包),這些也將工作:
> N <- lengths(m)
> sparseMatrix(i=1+length(m)-sequence(N), j=rep.int(N,N), x=unlist(m))
4 x 4 sparse Matrix of class "dgCMatrix"
[1,] . . . 10
[2,] . . 6 9
[3,] . 3 5 8
[4,] 1 2 4 7
這幾乎是一樣的成語爲上三角矩陣:
> sparseMatrix(i=sequence(N), j=rep.int(N,N), x=unlist(m))
4 x 4 sparse Matrix of class "dgCMatrix"
[1,] 1 2 4 7
[2,] . 3 5 8
[3,] . . 6 9
[4,] . . . 10
因爲你的答案好100倍。數字回到數字並不是真正的應該做的事情 –
是的,也許,但我認爲它的有用介紹了隱藏在包中的鮮爲人知的函數(否則ID永遠不會了解它們!) – user20650