树列表反向降低R中的三角矩阵

时间:2015-11-14 00:48:17

标签: r list matrix data-structures tree

我将如何转换

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

赞赏一个想法或一些指导!感谢您的耐心等待,如果问题太幼稚或需要其他信息(我很乐意提供)。

4 个答案:

答案 0 :(得分:7)

我查了一个基础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, ]

答案 1 :(得分:4)

1) lapply下方nm的每个组件添加sapply个零,而n为第mm 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

,并提供:

rev(seq_len(n))

如果n:1可以为零,则使用sapply代替m

2)直接sapply(m, function(v) c(numeric(n - length(v)), rev(v))) 也有效。它将undefined method length for nil:NilClass的每个反向分量与适当数量的零和重新形成前缀成矩阵:

illness.erb

答案 2 :(得分: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

答案 3 :(得分:1)

如果您使用的是稀疏矩阵(来自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