【问题标题】:rownames and colnames with specific value具有特定值的行名和列名
【发布时间】:2013-03-23 13:30:11
【问题描述】:

我有这个矩阵,我想得到一个 2 列矩阵,其中一列是行名,另一列是值为 1 的单元格的列名

x

   X1 X2 X3
X1  1 0   1
X2  0 1   0
X3  0 1   1
X4  1 0   0



str(x)
num [1:886, 1:886] 1 0 1 1 1 0 1 1 1 1

我想要这样的矩阵

# X1  X1 
# X1  X3   
# X2  X2   
# X3  X2   
# X3  X3   
# X4  X1   

哪些是 value=1 的对

提前致谢, A.

【问题讨论】:

  • 你能添加一个你想要得到什么结果的例子吗?而且,x这里不是向量而是矩阵?
  • 对不起! x 是一个矩阵(我编辑了我的问题)
  • 欢迎来到 Stack Overflow!还请显示您到目前为止尝试过的内容。 SO 不是免费编写代码的地方。告诉你到目前为止你尝试了什么也表明你真的希望从解决方案中学习,而不是仅仅在解决方案之后

标签: r matrix rowname


【解决方案1】:

你可以这样做:

mat <- which(x==1, arr.ind=TRUE)
mat[,"col"] <- names(x)[mat[,"col"]]
mat[,"row"] <- rownames(mat)

这会给:

   row  col 
X1 "X1" "X1"
X4 "X4" "X1"
X2 "X2" "X2"
X3 "X3" "X2"
X1 "X1" "X3"
X3 "X3" "X3"

【讨论】:

    【解决方案2】:

    这里有另一种选择:

    mm <- expand.grid(rownames(mat),colnames(mat))[as.vector(mat==1),]
    
     Var1 Var2
    1    X1   X1
    4    X4   X1
    6    X2   X2
    7    X3   X2
    9    X1   X3
    11   X3   X3
    

    为了得到 OP 显示,我们按第一列排序:

     mm[order(mm$Var1),]
       Var1 Var2
    1    X1   X1
    9    X1   X3
    6    X2   X2
    7    X3   X2
    11   X3   X3
    4    X4   X1
    

    这里是你的输入,我复制:

    mat <- data.frame(X1=c(1,0,0,1),X2=c(0,1,1,0),X3=c(1,0,1,0))
    rownames(mat)= paste0('X',1:4)
    
       X1 X2 X3
    X1  1  0  1
    X2  0  1  0
    X3  0  1  1
    X4  1  0  0
    

    【讨论】:

    • 谢谢你,它解决了我的问题!有人能告诉我如何命名新的列名吗?我想重命名 Var1 和 Var2
    【解决方案3】:

    这里有一个答案

    x
    ##    X1 X2 X3
    ## X1  1  0  1
    ## X2  0  1  0
    ## X3  0  1  1
    ## X4  1  0  0
    
    
    cbind(rownames(x)[row(x) * x], colnames(x)[col(x) * x])
    ##      [,1] [,2]
    ## [1,] "X1" "X1"
    ## [2,] "X4" "X1"
    ## [3,] "X2" "X2"
    ## [4,] "X3" "X2"
    ## [5,] "X1" "X3"
    ## [6,] "X3" "X3"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多