2014-07-08 5 views
1

Я имеюВыбор строк обусловливающих значений столбца из нескольких матриц

mat1 = matrix(c(2, 4, 3, 6, 7, 8), nrow=2, ncol=3) 
mat2 = matrix(c(5, 6, 7, 1, 2, 3), nrow=2, ncol=3) 
mat3 = matrix(c(8, 5, 8, 6, 7, 9), nrow=2, ncol=3) 

, которая дает мне 3 матрицы:

 [,1] [,2] [,3] 
[1,] 2 3 7 
[2,] 4 6 8 

     [,1] [,2] [,3] 
[1,] 5 7 2 
[2,] 6 1 3 

    [,1] [,2] [,3] 
[1,] 8 8 7 
[2,] 5 6 9 

То, что я хотел бы сделать, это сравнить три матрицы в ряд за первый столбец , и выберите строку матрицы, которая имеет самое высокое значение в первом столбце.

Например: в столбце 1 столбца 1 матрица 3 имеет наибольшее значение (8) по сравнению с матрицей 1 (2) и матрицей2 (5). В столбце 1 строки 2 матрица 2 имеет наибольшее значение (6). Я хотел бы создать новую матрицу, которая копирует строку матрицы, которая имеет, что наибольшее значение, в результате чего:

 [,1] [,2] [,3] 
[1,] 8 8 7  <- From mat3 
[2,] 6 1 3  <- From mat2 

Я знаю, как получить вектор с наибольшими значениями из столбца 1, но я не могу получить вся строка матрицы копируется в новую матрицу. У меня есть:

mat <- (mat1[1,]) 

который просто копирует первую строку первой матрицы

[1] 2 3 7 

можно выбрать номер максимальное количество:

max(mat1[,1],mat2[,1],mat3[,1]) 

[1] 8 

Но я не могу совмещать два возвращают матрицу со всей строкой. Получение кода для цикла для каждой строки будет без проблем, но я не могу заставить его работать для первой строки и как таковой, мне не хватает необходимого кода. Любая помощь будет принята с благодарностью. Спасибо.

ответ

1

вы работаете в интерактивном режиме? Вы манипулируете несколькими матрицами, распространенными в вашем рабочем пространстве? Прямолинейный ответ на вашу проблему может быть:

#which matrices have the largest element of column 1 in each row? 
max.col(cbind(mat1[, 1], mat2[, 1], mat3[, 1])) 
#[1] 3 2 

rbind(mat3[1, ], mat2[2, ]) #use the above information to get your matrix 
#  [,1] [,2] [,3] 
#[1,] 8 8 7 
#[2,] 6 1 3 

На более ganeral потребительной случае, способ может быть:

mat_ls = list(mat1, mat2, mat3) #put your matrices in a "list" 
which_col = 1 #compare column 1 
which_mats = max.col(do.call(cbind, lapply(mat_ls, function(x) x[, which_col]))) 
do.call(rbind, lapply(seq_along(which_mats), 
         function(i) mat_ls[[which_mats[i]]][i, ])) 
#  [,1] [,2] [,3] 
#[1,] 8 8 7 
#[2,] 6 1 3 
1

Вероятно, не симпатичное решение

temp <- rbind(mat1, mat2, mat3) 
rbind(temp[c(T,F),][which.max(temp[c(T,F),][, 1]),], 
temp[c(F,T),][which.max(temp[c(F,T),][, 1]),]) 

##  [,1] [,2] [,3] 
## [1,] 8 8 7 
## [2,] 6 1 3 
1

Вы также можете попробовать:

a2 <- aperm(simplify2array(mget(ls(pattern="mat"))),c(3,2,1)) #gets all matrices with name `mat` 
t(sapply(1:(dim(a2)[3]), function(i) {x1 <- a2[,,i]; x1[which.max(x1[,1]),]})) 
# [,1] [,2] [,3] 
#[1,] 8 8 7 
#[2,] 6 1 3 
Смежные вопросы