如何使用具有列名和行名的值创建Matrix?

问题描述 投票:2回答:5

这是一个可重现的代码

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
5个回答
2
投票

这是一个单行。所有矢量化,无需循环。

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 <- matrix(sample(1:12,12,T),ncol=4)复制结果。


3
投票

这是一个使用两个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]

3
投票

您可以使用以下代码来获得所需内容:

  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="")
   }
  }

1
投票

尝试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"

1
投票

矩阵必须具有所有相同数据类型的值。因此,首先使用as.data.frame()转换为dataframe。然后使用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
© www.soinside.com 2019 - 2024. All rights reserved.