如何创建具有列名称和行名称的值的矩阵?

时间:2018-09-04 18:45:40

标签: r dataframe matrix

这是可复制的代码

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

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

5 个答案:

答案 0 :(得分: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 :(得分: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]

答案 2 :(得分: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 :(得分: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"

答案 4 :(得分:1)

矩阵必须具有所有相同数据类型的值。因此,首先使用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