首页 > 解决方案 > 如何将矩阵转置为第二列,而第一列是第一个元素

问题描述

首先,我一生中从未编写过任何代码,而这周我只是在学习 R。我不确定标题是否清楚,但我想显示我的问题更容易:假设我有这个矩阵(m):

        [,1] [,2] [,3] [,4]
 [1,]    A    1    2    3
 [2,]    B    1    4
 [3,]    C    3

基本上,A 包含 1、2 和 3,B 包含 1 和 4,依此类推。我将如何在只有 2 列的矩阵中显示它?

        [,1] [,2]
 [1,]    A    1
 [2,]    A    2
 [3,]    A    3
 [4,]    B    1
 [5,]    B    4
 [6,]    C    3

非常感谢!

标签: rmatrixvector

解决方案


假设显示的NA空格是_ _rowSumscbindreptNA

n <- rowSums(!is.na(m1[,-1]))
cbind(rep(m1[,1], n), na.omit(c(t(m1[,-1]))))
#   [,1] [,2]
#[1,] "A"  "1" 
#[2,] "A"  "2" 
#[3,] "A"  "3" 
#[4,] "B"  "1" 
#[5,] "B"  "4" 
#[6,] "C"  "3" 

或者更紧凑的选项是复制带有col索引的第一列,cbind并使用t其余列的排列,最后删除 NA 行na.omit

na.omit(cbind(m1[,1][col(m1[,-1])], c(t(m1[,-1]))))
#   [,1] [,2]
#[1,] "A"  "1" 
#[2,] "A"  "2" 
#[3,] "A"  "3" 
#[4,] "B"  "1" 
#[5,] "B"  "4" 
#[6,] "C"  "3" 

注意:matrix不能有多个列类型。所以,如果有一个字符类,所有的元素都转换为character

数据

m1 <- structure(c("A", "B", "C", "1", "1", "3", "2", "4", NA, "3", 
NA, NA), .Dim = 3:4)

推荐阅读