2015-11-14 28 views
5

Tôi là người dùng R mới (~ 1 ngày). Tôi đang cố gắng tạo ra tất cả 216 kết quả của ba cú ném chết sáu mặt. Vấn đề là sau đó áp dụng một số chức năng cho mỗi bộ ba (nói, giá trị mặt tối đa). Đây là những gì tôi đã đưa ra:tạo ma trận/sử dụng bên ngoài

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) 

Có cách nào tốt hơn và ngắn gọn hơn để làm điều này với R? tôi sẽ đã thích sử dụng outer theo cách này:

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

nhưng nó không thành công với các lỗi

Lỗi trong ngoài (1: 6, 1: 6, max): dims [sản phẩm 36] không phù hợp với chiều dài của đối tượng [1]

+0

'bên ngoài() 'có ba đối số/thông số. Bên ngoài của bạn 'bên ngoài()' chỉ có hai. Và đối với tham số hàm không castin thành ký tự, 'max' là thứ khác với' "max" '. (một số hàm, trong đó có tham số chức năng chịu đựng cũng là một chuỗi ký tự, nhưng không phải tất cả) – jogo

+0

@jogo, xin lỗi điều 1: 6 bị thiếu là lỗi đánh máy. Nhưng nó vẫn không hoạt động: 'bên ngoài (bên ngoài (1: 6, 1: 6, max), 1: 6, max)' ném cùng một lỗi – Aky

+0

@Aky Bạn đã thử nghiệm các giải pháp được đăng bên dưới? – akrun

Trả lời

6

Chúng ta có thể sử dụng expand.grid để tạo ra các kết hợp trong một data.frame, chuyển đổi sang matrix và nhận được giá trị lớn nhất của tro h hàng bởi rowMaxs từ 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 

Hoặc chúng ta có thể sử dụng pmax với expand.grid

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

Hoặc theo đề nghị của @Ben Bolker, chúng tôi cũng có thể sử dụng apply với MARGIN=1

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

lựa chọn khác là outer với 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 

Hoặc outer với Vectorize d max

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

Cảm ơn .. bạn có thể giải thích tại sao 'max' không thành công? – Aky

+0

@Aky Nó sẽ hoạt động nếu bạn 'Vectorize'' max' – akrun

+1

Được rồi, tôi đã không chạy qua Vectorize trước đây. Tôi sẽ xem xét nó sau. – Aky

Các vấn đề liên quan