使列表中的所有元素在维度上相等

时间:2017-03-07 12:00:18

标签: r

我在列表对象中有224个表。这些表的维度不相等,所有较小的表具有colnames和rownames作为最大的嵌套子集。我想在每个不完整的表中找到缺少的列和缺少的行,并在整个填充零。示例:

列表:

$A

     1 2 3 4 6 8 
 500 0 1 1 2 7 0 
 600 1 2 7 0 0 0 
 700 0 0 0 1 0 0


 $B
     2 3 4 9
 700 0 0 0 1
 900 1 1 3 1 



$C
     1 2 3 4 5 6 7 8 9 10
500  0 0 0 0 1 2 2 1 3 4 
600  1 2 1 2 3 4 1 0 0 0
700  7 8 9 0 0 0 0 0 0 0 
800  0 1 2 1 2 3 4 1 1 1 
900  9 8 0 0 0 0 0 0 0 0
1000 1 1 1 1 0 0 8 9 10 11

应该成为:

newlist:

 $A

      1 2 3 4 5 6 7 8 9 10
 500  0 1 1 2 0 7 0 0 0 0
 600  1 2 7 0 0 0 0 0 0 0
 700  0 0 0 1 0 0 0 0 0 0
 800  0 0 0 0 0 0 0 0 0 0 
 900  0 0 0 0 0 0 0 0 0 0
 1000 0 0 0 0 0 0 0 0 0 0

 $B
      1 2 3 4 5 6 7 8 9 10
 500  0 0 0 0 0 0 0 0 0 0
 600  0 0 0 0 0 0 0 0 0 0
 700  0 0 0 0 0 0 0 0 1 0
 800  0 0 0 0 0 0 0 0 0 0
 900  0 1 1 3 0 0 0 0 1 0 
 1000 0 0 0 0 0 0 0 0 0 0


$C
     1 2 3 4 5 6 7 8 9 10
500  0 0 0 0 1 2 2 1 3 4 
600  1 2 1 2 3 4 1 0 0 0
700  7 8 9 0 0 0 0 0 0 0 
800  0 1 2 1 2 3 4 1 1 1 
900  9 8 0 0 0 0 0 0 0 0
1000 1 1 1 1 0 0 8 9 10 11

我理解一个可重现的例子在获取响应方面有很长的路要走,但我的列表元素的表格格式有点棘手,原始数据集非常复杂,无法在此处发布。它可能只是吓跑任何潜在的接受者。我认为,上面提到的问题对我要问的问题是正确的。谢谢。

3 个答案:

答案 0 :(得分:1)

像你一样创建示例列表:

x <- lapply(2:4, function(i) structure(matrix(1:(i^2), nrow=i, ncol=i),
                               dimnames=list(100*1:i, 100*1:i)))

按行/列名称填写缺失的行和列:

cols <- unique(unlist(sapply(x, colnames)))
rows <- unique(unlist(sapply(x, rownames)))

result <- lapply(x, function(m) {
  missingrows <- setdiff(rows, rownames(m))
  missingcols <- setdiff(cols, colnames(m))
  rbind(cbind(m,
    structure(matrix(0, nrow=nrow(m), ncol=length(missingcols)),
      dimnames=list(NULL, missingcols))),
    structure(matrix(0, nrow=length(missingrows), ncol=length(cols)),
      dimnames=list(missingrows)))
})

请注意,使用此方法保证表中行和列的相同排序 (这通常不可能,因为我们无法保证现有行/列的顺序在各个表之间是相同的)。此外,表之间对应的行/列始终可以通过匹配的名称进行标识。

答案 1 :(得分:0)

虽然这绝对不是最有效的解决方案,但它应该提供快速解决方案:

创建一个映射矩阵(我假设原始矩阵有6行10列):

mat <- matrix(0,6,10)

colnames(mat) <- 1:10

rownames(mat) <- seq(500,1000,100)

重复映射矩阵n次(dat是你的矩阵列表):

mat_list <- replicate(length(dat),mat,simplify=FALSE)

循环遍历矩阵列表:

for (i in seq_along(dat)) {
   mat_list[[i]][match(rownames(dat[[i]]), rownames(mat_list[[i]])),match(colnames(dat[[i]]), colnames(mat_list[[i]]))] <- as.matrix((dat[[i]]))
 }

mat_list

答案 2 :(得分:0)

你可以使用行名和列名以及矩阵索引来做一些很酷的事情。

dims <- sapply(lst, dim)
rowMax <- which.max(dims[1,])
colMax <- which.max(dims[2,])

# assume largest matrix is uniquely identifiable
matrixMax <- lst[[rowMax]]

# pad out a matrix to the size of the largest
fillMatrix <- function(m, mMax)
{
    mNew <- matrix(0, nrow=nrow(mMax), ncol=ncol(mMax), dimnames(mMax))
    mNew[rownames(m), colnames(m)] <- m
    mNew
}

lst[] <- lapply(lst, fillMatrix, mMax=matrixMax)