for цикл для перекомпоновки матрицы из двух других матричных индексов

У меня есть две матрицы с одинаковым количеством строк и столбцов, и я хотел бы объединить их по их индексу, чтобы создать новую матрицу (я не знаю заранее ни nrow (), ни ncol (), nrow () исходит из k k означает центр тяжести кластеров, а ncol () исходит из значений k 'knn)

A <- matrix(sample(letters), ncol = 10, nrow = 3)
B <- matrix(sample(letters), ncol = 10, nrow = 3)

A

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "h"  "p"  "j"  "w"  "z"  "e"  "q"  "o"  "s"  "y"  
[2,] "y"  "b"  "k"  "t"  "a"  "v"  "f"  "x"  "c"  "r"  
[3,] "r"  "i"  "m"  "g"  "d"  "n"  "l"  "u"  "h"  "p"  

B

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]      
[1,] "k"  "q"  "l"  "n"  "o"  "r"  "u"  "b"  "s"  "y"       
[2,] "y"  "f"  "v"  "c"  "t"  "w"  "h"  "a"  "d"  "x"       
[3,] "x"  "e"  "j"  "g"  "m"  "i"  "p"  "z"  "k"  "q"       

Нахожу их индекс:

a <- which(A !=0, arr.ind = T)
b <- which(B !=0, arr.ind = T)

Я хотел бы, чтобы окончательная матрица объединяла A и B по строке и по индексу столбца, чтобы A [1,1] находился непосредственно перед B [1,1]

A[1,1]  B[1,1]  A[1,2]  B[1,2]  A[1,3]  B[1,3]  A[1,4]  B[1,4]  ...
A[2,1]  B[2,1]  A[2,2]] B[2,2]  A[2,3]  B[2,3]  A[2,4]  B[2,4]  ...
A[3,1]  B[3,1]  A[3,2]  B[3,2]  A[3,3]  B[3,3]  A[3,4]  B[3,4]  ...

Так, например, первая строка будет:

h   k   p   q   j   l   w   n   z   o

Я обнаружил здесь, что функция lapply выполняет свою работу, но дает мне список :

t <- lapply(1:length(knn.mat),
        function(i){cbind(A[i], B[i])})

Я не могу просто исключить список, потому что я заранее не знаю, сколько строк и столбцов будет в моей входной матрице, и я хотел бы получить матрицу или фрейм данных в качестве выходных данных, возможно, что-то с циклом for, которое я мог бы использовать с функцией из применяемой семьи? (этот не работает)

doMat <- function(x,y){
  X <- matrix(0, nrow = nrow(x), ncol = ncol(x)*2)
  for (i in 1:nrow(x))
 {
    X[i] <- cbind(x[i],y[i])
    i = i+1
  }
  return(X)}

person Mariko    schedule 31.05.2017    source источник


Ответы (3)


Это будет сделано в одной строке - используя способ, которым R может обрабатывать матрицы как векторы.

AB <- matrix(matrix(c(t(A),t(B)),nrow=2,byrow=TRUE),ncol=2*ncol(A),byrow=TRUE)

A
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "x"  "a"  "u"  "t"  "r"  "g"  "z"  "d"  "l"  "v"  
[2,] "v"  "h"  "n"  "w"  "i"  "b"  "k"  "o"  "y"  "m"  
[3,] "m"  "q"  "p"  "c"  "e"  "j"  "f"  "s"  "x"  "a"  

B
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "v"  "e"  "n"  "j"  "w"  "h"  "d"  "m"  "z"  "p"  
[2,] "p"  "g"  "t"  "a"  "f"  "r"  "i"  "s"  "q"  "c"  
[3,] "c"  "y"  "o"  "u"  "l"  "k"  "b"  "x"  "v"  "e"  

AB
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,] "x"  "v"  "a"  "e"  "u"  "n"  "t"  "j"  "r"  "w"   "g"   "h"   "z"   "d"   "d"   "m"   "l"   "z"   "v"   "p"  
[2,] "v"  "p"  "h"  "g"  "n"  "t"  "w"  "a"  "i"  "f"   "b"   "r"   "k"   "i"   "o"   "s"   "y"   "q"   "m"   "c"  
[3,] "m"  "c"  "q"  "y"  "p"  "o"  "c"  "u"  "e"  "l"   "j"   "k"   "f"   "b"   "s"   "x"   "x"   "v"   "a"   "e" 
person Andrew Gustar    schedule 31.05.2017
comment
Большое спасибо, это идеально подходит для моей цели! - person Mariko; 31.05.2017

еще один дубль :)

A <- matrix(sample(letters), ncol = 10, nrow = 3)
B <- matrix(sample(letters), ncol = 10, nrow = 3)   

# > A
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] "h"  "f"  "g"  "q"  "e"  "s"  "a"  "b"  "v"  "i"  
# [2,] "i"  "o"  "t"  "y"  "r"  "z"  "u"  "x"  "w"  "l"  
# [3,] "l"  "c"  "m"  "n"  "k"  "p"  "j"  "d"  "h"  "f"

# > B
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] "b"  "p"  "e"  "g"  "x"  "q"  "k"  "o"  "r"  "d"  
# [2,] "d"  "j"  "n"  "v"  "w"  "l"  "t"  "a"  "c"  "f"  
# [3,] "f"  "u"  "z"  "m"  "h"  "s"  "y"  "i"  "b"  "p"

column_order <-rep(seq(1:ncol(A)),each=2) + rep(c(0,ncol(A)),times=ncol(A)) # 1,11,2,12 ...
AB_sorted  <- cbind(A,B)[,column_order]

# > AB_sorted
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
# [1,] "p"  "f"  "u"  "g"  "n"  "t"  "q"  "x"  "m"  "n"   "k"   "w"   "h"   "e"   "l"   "a"   "w"   "p"   "x"   "o"  
# [2,] "x"  "o"  "e"  "m"  "o"  "s"  "g"  "i"  "r"  "j"   "t"   "k"   "d"   "z"   "c"   "q"   "i"   "h"   "v"   "l"  
# [3,] "v"  "l"  "j"  "y"  "a"  "r"  "y"  "b"  "f"  "c"   "s"   "u"   "z"   "v"   "b"   "d"   "p"   "f"   "u"   "g"
person Moody_Mudskipper    schedule 31.05.2017

Если все, что вы пытаетесь сделать, - это переплетать столбцы, вы можете использовать подход, аналогичный тому, что было в этом вопросе: Чередование, переплетение или чередование двух векторов

Кажется, это работает: matrix(c(rbind(A,B)), nrow = nrow(A))

Изменить:

Как отметил @Moody_Mudskipper в комментариях, c() в этом случае на самом деле лишнее: matrix(rbind(A,B), nrow = nrow(A)) будет работать так же хорошо.

person ssokolen    schedule 31.05.2017
comment
умный! Но зачем использовать c() вокруг rbind? - person Moody_Mudskipper; 31.05.2017
comment
@Moody_Mudskipper Спасибо, что указали на это, в этом нет необходимости. Просто у меня есть привычка кормить плоские векторы в matrix(). - person ssokolen; 31.05.2017
comment
О боже, я так усложнил! Так много танков! Любая ссылка на матричные операторы R, чтобы я не застрял в другом базовом? - person Mariko; 31.05.2017
comment
@ Марико Нет проблем. Не стесняйтесь принять ответ, если он отвечает на ваш вопрос. Что касается ссылок, это конкретное решение было простым только потому, что оно полагалось на то, как R создает матрицы. Вы можете здесь ознакомиться с некоторыми расширенными стратегиями индексирования, которые могут помочь вам в более сложные ситуации. - person ssokolen; 31.05.2017