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