Как создать Матрицу со значениями, имеющими имя столбца и имя строки? - PullRequest
0 голосов
/ 04 сентября 2018

Вот воспроизводимый код

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 голосов
/ 04 сентября 2018

Матрица должна иметь значения одного и того же типа данных. Итак, сначала конвертируем в dataframe используя 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
0 голосов
/ 04 сентября 2018

Вот одна строка. Все векторизовано, петли не нужны.

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) для репликации результатов.

0 голосов
/ 04 сентября 2018

Вы можете использовать следующий код, чтобы получить то, что вы хотите:

  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="")
   }
  }
0 голосов
/ 04 сентября 2018

Вот решение с использованием двух for петель. Благодаря @ Грегор.

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]
0 голосов
/ 04 сентября 2018

Попробуйте 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...