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
Đ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. –
@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
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! –