2013-05-22 28 views
7
> x <- array(-10:10, dim=c(4,5)) 
> x 
    [,1] [,2] [,3] [,4] [,5] 
[1,] -10 -6 -2 2 6 
[2,] -9 -5 -1 3 7 
[3,] -8 -4 0 4 8 
[4,] -7 -3 1 5 9 

Làm thế nào để áp dụng "max (x, 0)" cho mỗi yếu tố để tôi có được ma trận này:Sử dụng tối đa trên mỗi phần tử của một ma trận

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

Trả lời

14

Sử dụng pmax:

pmax(x,0) 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 0 0 0 2 6 
#[2,] 0 0 0 3 7 
#[3,] 0 0 0 4 8 
#[4,] 0 0 1 5 9 
+0

Điều này không hiệu quả đối với tôi. Tôi đã làm '> x = read.csv (...)> x2 = sapply (dữ liệu, atanh)> pmax (x2, -20)' nhưng điều này tạo ra một vectơ '-20' thay vì một ma trận của kích thước ban đầu. (Lưu ý rằng '> class (x2) [1]" matrix "' eventhough '> class (x) [1]" data.frame "') @Chase giải pháp của anh ta đã làm việc. –

+2

@TimKuipers 'pmax' duy trì' mờ 'của đối tượng - bạn có thể bỏ qua một bước hoặc 'x2' của bạn không phải là hình chữ nhật – eddi

+0

Không. Sai lầm tôi tạo ra là vì ma trận của tôi thực sự lớn, tôi đã cố gắng nhìn vào một phần của nó bằng cách thực hiện 'x2 [1:10]' thay vì 'x2 [1:10,]'. Tôi xin lôi! –

5

Bạn có thể sử dụng chức năng lập chỉ mục R của [ để làm điều này trực tiếp:

x <- array(-10:10, dim=c(4,5)) 
x[x < 0] <- 0 

này hoạt động vì x < 0 tạo ra một đầu ra ma trận logic:

x < 0 

    [,1] [,2] [,3] [,4] [,5] 
[1,] TRUE TRUE TRUE FALSE FALSE 
[2,] TRUE TRUE TRUE FALSE FALSE 
[3,] TRUE TRUE FALSE FALSE FALSE 
[4,] TRUE TRUE FALSE FALSE FALSE 

Và ma trận kết quả là:

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

Thời gian giữa hai phương pháp là đáng ngạc nhiên tương tự. Dưới đây là ví dụ lớn hơn minh họa các thời gian có thể so sánh:

xbigC <- xbigE <- matrix(sample(-100:100, 1e8, TRUE), ncol = 1e4) 
system.time(xbigC[xbigC < 0] <- 0) 
#--- 
    user system elapsed 
    4.56 0.37 4.93 
system.time(xbigE <- pmax(xbigE,0)) 
#--- 
    user system elapsed 
    4.10 0.51 4.62 
all.equal(xbigC, xbigE) 
#--- 
[1] TRUE 
+0

cảm ơn bạn đã cho tôi những tùy chọn này – ManInMoon

+0

@ManInMoon - vâng, đừng lo. Cách tiếp cận lập chỉ mục trực tiếp sẽ linh hoạt hơn ở chỗ bạn có thể tạo ra các điều kiện phức tạp hơn với các toán tử logic khác. Đối với nhiệm vụ này, có vẻ như 'pmax()' là bao giờ nên hiệu quả hơn một chút. – Chase

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