【问题标题】:How to create a Matrix with values having column name and row name?如何创建具有列名和行名的值的矩阵?
【发布时间】:2018-09-04 18:45:40
【问题描述】:

这是一个可重现的代码

A <- matrix(sample(1:12,12,T),ncol=4)
rownames(A) <- letters[1:3]
colnames(A) <- letters[11:14]

矩阵现在看起来像

   k  l m  n
a  9 12 5 12
b 10  9 3  2
c 11 11 9  7

我希望我的矩阵看起来像这样

   k                       l                        m                 n
a row a column k value 9   12                       5                12
b row b column k value 10   9                       3                 2
c row c column k value 11  11                       9                 7

与矩阵中的其他值类似(我不写,因为它变得混乱)。

【问题讨论】:

    标签: r dataframe matrix


    【解决方案1】:

    这是一个使用两个for 循环的解决方案。感谢@Gregor。

    for (i in 1:nrow(A)) {
      for (j in 1:ncol(A))
       A[i, j] <- 
        paste("row", rownames(A)[i], "column", colnames(A)[j], "value", A[i, j])
    }
    A
    #  k                        l                         m                         n                       
    #a "row a column k value 4" "row a column l value 11" "row a column m value 12" "row a column n value 1"
    #b "row b column k value 5" "row b column l value 3"  "row b column m value 8"  "row b column n value 3"
    #c "row c column k value 7" "row c column l value 11" "row c column m value 8"  "row c column n value 3"
    

    数据

    set.seed(1)
    A <- matrix(sample(1:12,12,T),ncol=4)
    rownames(A) <- letters[1:3]
    colnames(A) <- letters[11:14]
    

    【讨论】:

    • 我认为rownames(A)[i] 会比rownames(A[i, , drop = FALSE]) 更简单(colnames 也是如此)。
    【解决方案2】:

    你可以使用下面的代码来得到你想要的:

      for (i in 1:nrow(A)){
       for (j in 1:ncol(A)){
        A[i,j]<- paste("row ",rownames(A)[i]," column ",colnames(A)[j]," value ", A[i,j], sep="")
       }
      }
    

    【讨论】:

    • 这没有给出想要的输出。
    • 如果将循环中的ij 替换为rownames(A)[i]colnames(A)[j],这将起作用
    • @Gregor 我根据您的建议编辑了我的答案。感谢您的评论!
    【解决方案3】:

    这是一个单行。全部矢量化,无需循环。

    matrix(sprintf("row %s column %s value %s",
                   rownames(A)[row(A)],
                   colnames(A)[col(A)], A),
           nrow = nrow(A))
    
    #      [,1]                      [,2]                      [,3]                    
    # [1,] "row a column k value 12" "row a column l value 10" "row a column m value 5"
    # [2,] "row b column k value 5"  "row b column l value 7"  "row b column m value 6"
    # [3,] "row c column k value 10" "row c column l value 9"  "row c column m value 7"
    #      [,4]                     
    # [1,] "row a column n value 12"
    # [2,] "row b column n value 2" 
    # [3,] "row c column n value 9" 
    

    使用set.seed(47)A &lt;- matrix(sample(1:12,12,T),ncol=4) 来复制结果。

    【讨论】:

    • 这很好。也可以写成A[] &lt;- sprintf("row %s column %s value %s", rownames(A)[row(A)], colnames(A)[col(A)], A),完全符合OP的期望。
    • 有点短,但我喜欢不一定要覆盖原件的选项,不管 OP 的措辞如何。如果他们愿意,他们可以随时使用A &lt;-
    【解决方案4】:

    尝试as.data.frame.table,然后粘贴名称。

    x <- as.data.frame( as.table(A))
    x
       Var1 Var2 Freq
    1     a    k    2
    2     b    k   10
    3     c    k   12
    4     a    l    5
    5     b    l    4
    6     c    l   11
    7     a    m    4
    8     b    m    8
    9     c    m    8
    10    a    n    5
    11    b    n    5
    12    c    n    6
    y <- apply(x, 1, function(y) paste(c("row", "column", "value"), y, collapse=" "))
    matrix(y, nrow =3, dimnames = dimnames(A))
    k                         l                         m                         n                        
    a "row a column k value  2" "row a column l value  5" "row a column m value  4" "row a column n value  5"
    b "row b column k value 10" "row b column l value  4" "row b column m value  8" "row b column n value  5"
    c "row c column k value 12" "row c column l value 11" "row c column m value  8" "row c column n value  6"
    

    【讨论】:

      【解决方案5】:

      矩阵必须具有所有相同数据类型的值。因此,首先使用as.data.frame() 转换为数据帧。然后使用paste() 创建连接字符串并更新新创建的数据框中的 k 列。

      B <- as.data.frame(A)
      B$k <- paste('row', rownames(B), 'column k value', B$k)
      B
      
      #                        k  l m  n
      # a row a column k value 8 11 8  2
      # b row b column k value 7 12 7  2
      # c row c column k value 6  6 2 12
      

      【讨论】:

      • OP 想要整个矩阵,而不仅仅是一列。 (问题的最后一行是“与矩阵中的其他值类似(我不写因为它变得混乱)”
      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2019-07-22
      • 2018-06-25
      • 2014-03-31
      • 2017-10-28
      相关资源
      最近更新 更多