如何仅将列表中的行矩阵转换为R中的列矩阵?

How to convert only row matrices in a list to column matrices in R?

提问人:cliu 提问时间:1/25/2022 更新时间:1/25/2022 访问量:42

问:

我有一个矩阵列表,其中大多数矩阵是列矩阵,但其中一些是行矩阵。如何仅将那些行矩阵转换为列矩阵?我想使用基础 R 来实现这一点。

这是矩阵列表,其中第三个矩阵是行矩阵

x <- list(`1` = matrix(1:20, nrow=5), `2` = matrix(1:20, nrow=10), `3` = matrix(1:5, nrow=1))

如何将列表转换为这样的列表:

$`1`
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

$`2`
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

$`3`
[1,]    1    
[2,]    2    
[3,]    3   
[4,]    4    
[5,]    5  

我有一个更大的数据集,所以高效的代码是首选!

R 列表 操作 数据清洗

评论


答:

1赞 dcarlson 1/25/2022 #1

检查矩阵的维度,如果行维度为 1,则对其进行转置:

(y <- lapply(x, function(x) if(dim(x)[1] == 1) { t(x)} else x))
# $`1`
#      [,1] [,2] [,3] [,4]
# [1,]    1    6   11   16
# [2,]    2    7   12   17
# [3,]    3    8   13   18
# [4,]    4    9   14   19
# [5,]    5   10   15   20
# 
# $`2`
#       [,1] [,2]
#  [1,]    1   11
#  [2,]    2   12
#  [3,]    3   13
#  [4,]    4   14
#  [5,]    5   15
#  [6,]    6   16
#  [7,]    7   17
#  [8,]    8   18
#  [9,]    9   19
# [10,]   10   20
# 
# $`3`
#      [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4
# [5,]    5

评论

0赞 cliu 1/25/2022
谢谢你@dcarlson。这确实适用于我在这里的示例数据。不过还有一个问题。当我检查使用中的条件时,它显示 .难道不应该挑出适合条件的元素吗?ifdim(x)[1] == 1logical(0)
1赞 dcarlson 1/26/2022
是的,但是在里面,the 表示列表中的每个矩阵,即 , , x[[3]]x' 是一个列表,为 NULL。我应该在函数中使用不同的参数来更清楚地说明这一点,例如.function(x)lapply()xxx[[1]]x[[2]]. Since your dim(x)function(y) if(dim(y)[1] == 1) { t(y)} else y)
0赞 cliu 1/26/2022
谢谢你的澄清!