2016-08-17 5 views
1

Таким образом, по существу, у меня есть две матрицы:rbind используя для цикла вывода нескольких матриц

A<-matrix(runif(10*10),ncol = 10) 
B<-matrix(runif(10*10),ncol = 10) 

Я пытаюсь создать цикл, который будет: а) снять верхнюю строку матрицы А и и добавить вершину строки матрицы B в нижней части новой матрицы A, чтобы создать матрицу a.

б) удалить 2 верхние строки матрицы А и добавить 2 верхние строки матрицы В к нижней части новой матрицы А, чтобы создать матрицу б

с) Удалите 3 верхних строки матрицы A и добавьте 3 верхних ряда матрицы B в нижнюю часть новой матрицы A, чтобы создать матрицу c . , ,

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

a<-rbind(A[2:10,],B[1:1,]) 
b<-rbind(A[3:10,],B[1:2,]) 
c<-rbind(A[4:10,],B[1:3,]) 
d<-rbind(A[5:10,],B[1:4,]) 
. 
. 
. 

Вот моя попытка создать для цикла:

A<-matrix(c(rep(0,10*10)),nrow=10) 
n<-10 
for (i in 1:n-1){ 
    A<-rbind(R[(i+1):10,],ER[(1:i),]) 
} 

Это выводит только матрицу n-1, но я бы хотел, чтобы все мои матрицы были выведены.

ответ

1

Эта функция делает то, что вы хотите для произвольного числа строк nrows

switch_matrices <- function(mat1, mat2, nrows){ 
    rbind(mat1[(1+nrows):nrow(mat1),],mat2[1:nrows,]) 
} 

Вы можете проверить, что он работает

all.equal(rbind(A[2:10,],B[1:1,]) ,switch_matrices(A,B, 1)) 

Составьте список со всеми вашими кадров данных в каждом элементе списка ,

l <- lapply(1:9, function(nrows) switch_matrices(A,B, nrows)) 

Если вы хотите, чтобы каждый элемент списка l отдельной переменной в вашей глобальной среде вы можете использовать

list2env(setNames(l,paste0("AB",seq_along(l))), envir = parent.frame()) 
1

Одна идея состоит в том, чтобы создать функцию, которая принимает в качестве аргументов матриц и строк , Затем с помощью lapply итерировать,

fun1 <- function(x, y, n) { rbind(x[n:nrow(x),], y[1:n-1,])} 
lapply(2:nrow(A), function(i) fun1(A, B, i)) 
+0

Это кажется смутно знакомым;) – shayaa

+1

@shayaa, я этого не заметил. Великие умы... :) – Sotos

0

Я сделал несколько изменений в вашем решении, и я использовал переменную letters, которые обеспечивают список, например letters[2]=b.

Чтобы назначить каждую новую матрицу динамической переменной, я использовал функцию assign.

A<-matrix(runif(10*10),ncol = 10) 
B<-matrix(runif(10*10),ncol = 10) 
n<-nrow(A) 

for (i in 1:(n-1)){ 
    assign(letters[i],rbind(A[(i+1):10,],B[(1:i),])) 
    paste(letters[i]) 
} 
Смежные вопросы