用 NA 填充两个矩阵的缺失数据

Pad the missing data with NA for two matrices

提问人:cliu 提问时间:9/24/2022 更新时间:9/26/2022 访问量:113

问:

我有两个正方形矩阵,它们都有一些缺失的数据。我想用 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 填充矩阵的列表

R 矩阵 操作 数据

评论


答:

1赞 Quinten 9/24/2022 #1

您可以使用它来查找匹配的列和行,否则它将添加带有 NA 的列或行。用于对每个矩阵执行操作,以将结果生成为列表。您可以使用以下代码:matchlapply

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 属性中的列表命名异常)。我很高兴现在的答案显示了最佳实践:)NAtable