2015-11-14 2 views
5

Я новый пользователь (~ 1 день) R. Я пытаюсь создать все 216 результатов трех бросков шестисторонней смерти. Дело в том, чтобы затем применить некоторую функцию к каждому триплету (скажем, к максимальной номинальной стоимости). Это то, что я придумал:создание матриц/использование внешних

mat <- matrix(numeric(0), ncol=3) 
for (i in 1:6) { 
    for (j in 1:6) { 
     for (k in 1:6) { 
      mat <- rbind(mat, c(i, j, k)) 
     } 
    } 
} 

# find maximum of each outcome 
apply(mat, 1, max) 

Есть лучше и более краткий способ сделать это с помощью R? я бы любил использовать outer таким образом:

outer(1:6, outer(1:6, 1:6, max), max) 

но он терпит неудачу с ошибкой

Ошибки в наружном (1: 6, 1: 6, максимум): DIMS [продукт 36] не соответствует длине объекта [1]

+0

'внешняя()' имеет три аргумента/параметров. У вашего внешнего 'external()' есть только два. И для параметра функции не ссылайтесь на символ, 'max' - это нечто иное, чем' max. (некоторые функции, которые имеют параметр функции, допускают также строку символов, но не все) – jogo

+0

@jogo, извините, что отсутствующая вещь 1: 6 была опечаткой. Но он по-прежнему не работает: 'external (внешний (1: 6, 1: 6, max), 1: 6, max)' вызывает ту же ошибку – Aky

+0

@Aky Вы протестировали решения, размещенные ниже? – akrun

ответ

6

Мы можем использовать expand.grid для создания комбинаций в data.frame, конвертировать в matrix и получить максимальное значение EAC h ряд по rowMaxs из library(matrixStats).

library(matrixStats) 
rowMaxs(as.matrix(expand.grid(rep(list(1:6),3)))) 
#[1] 1 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 2 
#[38] 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 3 3 
#[75] 3 4 5 6 3 3 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 4 4 4 
#[112] 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 
#[149] 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 
#[186] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 

Или мы можем использовать pmax с expand.grid

do.call(pmax, expand.grid(rep(list(1:6),3))) 

Или как это было предложено @Ben Bolker, мы также можем использовать apply с MARGIN=1

apply(expand.grid(rep(list(1:6),3)),1,max) 

Другой вариант заключается outer с pmax.

c(outer(1:6, outer(1:6, 1:6, FUN=pmax), FUN= pmax)) 
#[1] 1 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 2 
#[38] 2 3 4 5 6 2 2 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 3 3 
#[75] 3 4 5 6 3 3 3 4 5 6 3 3 3 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 4 4 4 
#[112] 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 4 4 4 4 5 6 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 
#[149] 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 
#[186] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 

Или outer с Vectorize d max

f1 <- function(x,y) max(x,y) 
c(outer(1:6, outer(1:6, 1:6, Vectorize(f1)), Vectorize(f1))) 
+0

Спасибо .. Не могли бы вы объяснить, почему 'max' терпит неудачу? – Aky

+0

@Aky Он должен работать, если вы 'Vectorize'' max' – akrun

+1

Хорошо, я раньше не сталкивался с Vectorize. Я рассмотрю его позже. – Aky