提问人:cliu 提问时间:9/24/2022 更新时间:9/26/2022 访问量:113
用 NA 填充两个矩阵的缺失数据
Pad the missing data with NA for two matrices
问:
我有两个正方形矩阵,它们都有一些缺失的数据。我想用 NA 填充两个矩阵中的缺失数据
数据如下:
#first matrix
t1 = matrix(
c(1, 0, 1, 0, 0, 1, 1, 0, 1),
nrow = 3,
ncol = 3,
byrow = TRUE
)
rownames(t1) <- c("a","b", "c")
colnames(t1) <- c("a","b", "c")
#second matrix
t2 = matrix(
c(1, 1, 0, 0, 0, 1, 0, 0, 1),
nrow = 3,
ncol = 3,
byrow = TRUE
)
rownames(t2) <- c("a","c", "d")
colnames(t2) <- c("a","c", "d")
#Expected outcome for the two matrices:
#first matrix
a b c d
a 1 0 1 NA
b 0 0 1 NA
c 1 0 1 NA
d NA NA NA NA
#second matrix
a b c d
a 1 NA 1 0
b NA NA NA NA
c 0 NA 0 1
d 0 NA 0 1
我该如何实现?优选的结果是一个包含这两个 NA 填充矩阵的列表
答:
1赞
Quinten
9/24/2022
#1
您可以使用它来查找匹配的列和行,否则它将添加带有 NA 的列或行。用于对每个矩阵执行操作,以将结果生成为列表。您可以使用以下代码:match
lapply
l <- list(t1, t2)
lapply(l, \(x) {
# Your required columns and rows names
colrown=c("a","b","c","d")
# columns part
coln=colnames(x)
x=x[,match(colrown,coln)]
colnames(x)=colrown
# Rows part
rown=rownames(x)
x=x[match(colrown,rown),]
rownames(x)=colrown
return(x)
})
#> [[1]]
#> a b c d
#> a 1 0 1 NA
#> b 0 0 1 NA
#> c 1 0 1 NA
#> d NA NA NA NA
#>
#> [[2]]
#> a b c d
#> a 1 NA 1 0
#> b NA NA NA NA
#> c 0 NA 0 1
#> d 0 NA 0 1
创建于 2022-09-24 使用 reprex v2.0.2
数据
#first matrix
t1 = matrix(
c(1, 0, 1, 0, 0, 1, 1, 0, 1),
nrow = 3,
ncol = 3,
byrow = TRUE
)
rownames(t1) <- c("a","b", "c")
colnames(t1) <- c("a","b", "c")
#second matrix
t2 = matrix(
c(1, 1, 0, 0, 0, 1, 0, 0, 1),
nrow = 3,
ncol = 3,
byrow = TRUE
)
rownames(t2) <- c("a","c", "d")
colnames(t2) <- c("a","c", "d")
t1
#> a b c
#> a 1 0 1
#> b 0 0 1
#> c 1 0 1
t2
#> a c d
#> a 1 1 0
#> c 0 0 1
#> d 0 0 1
评论
1赞
cliu
9/25/2022
我确实需要稍微调整您的代码,但它适用于我更大的数据集。所以谢谢你!@Quinten
2赞
Robert Hacken
9/25/2022
#2
如果每个矩阵中的行名和列名始终相同(此处没有硬编码的行/列名):
nam <- union(rownames(t1), rownames(t2))
m <- array(dim=rep(length(nam), 2),
dimnames=list(nam, nam))
lapply(list(t1, t2), function(x) {
m[rownames(x), colnames(x)] <- x
m
})
# [[1]]
# a b c d
# a 1 0 1 NA
# b 0 0 1 NA
# c 1 0 1 NA
# d NA NA NA NA
#
# [[2]]
# a b c d
# a 1 NA 1 0
# b NA NA NA NA
# c 0 NA 0 1
# d 0 NA 0 1
评论
0赞
cliu
9/25/2022
嗨@Robert哈肯。谢谢你的代码。您的代码效果更好,因为我不需要对列名和行名进行编码。明!
0赞
cliu
9/25/2022
有没有办法摆脱和在输出中?.1
.2
1赞
Robert Hacken
9/25/2022
是的,我在回答中添加了一种创建初始矩阵的替代方法,该方法不命名维度。m
0赞
cliu
9/26/2022
@jay.sf 我想知道为什么这种方法不是一个好的做法。在某些情况下,它会导致代码中断吗?table
1赞
jay.sf
9/26/2022
@cliu 有一些常用的方法来初始化矩阵。这种方法相当代码艺术,难以理解(并且 dimnames 属性中的列表命名异常)。我很高兴现在的答案显示了最佳实践:)NA
table
评论