2012-10-11 32 views
17

Tôi có một khung dữ liệu 150.000 hàng với 2.000 cột chứa giá trị, một số là phủ định. Tôi đang thay thế các giá trị âm bằng 0, nhưng nó cực kỳ chậm để làm như vậy (~ 60 phút trở lên).Giá trị thay thế nhanh trong khung dữ liệu trong R

df[df < 0] = 0

nơi df[,1441:1453] trông giống như (tất cả các cột/giá trị số):

V1441 V1442 V1443 V1444 V1445 V1446 V1447 V1448 V1449 V1450 V1451 V1452 V1453 
1  3  1  0  4  4 -2  0  3 12  5 17 34 27 
2  0  1  0  7  0  0  0  1  0  0  0  0  0 
3  0  2  0  1  2  3  6  1  2  1 -6  3  1 
4  1  2  3  6  1  2  1 -6  3  1 -4  1  0 
5  1  2  1 -6  3  1 -4  1  0  0  1  0  0 
6  1  0  0  1  0  0  0  0  0  0  1  2  2 

Có cách nào để tăng tốc độ quá trình như vậy, ví dụ như cách tôi đang làm nó được hoàn toàn chậm, và có cách tiếp cận nhanh hơn cho điều này? Cảm ơn.

+0

150.000 hàng 2000 cột x: đây là đúng –

+0

Bạn có thể xin vui lòng [chỉ cho chúng ta] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) dữ liệu của bạn trông như thế nào? Tất cả các cột đều có số không? – Roland

Trả lời

29

Thử chuyển df của bạn thành ma trận.

df <- data.frame(a=rnorm(1000),b=rnorm(1000)) 
m <- as.matrix(df) 
m[m<0] <- 0 
df <- as.data.frame(m) 
+0

Nhiều. nhanh hơn nhiều ! Cảm ơn –

+0

Thực sự thực sự nhanh hơn! –

21

Cả hai cách tiếp cận của bạn ban đầu và câu trả lời hiện nay tạo ra một đối tượng kích thước giống như m (hoặc df) khi tạo m<0 (phương pháp ma trận là nhanh hơn vì có ít sao chép nội bộ với [<- so với [<-.data.frame

Bạn có thể sử dụng lapplyreplace, sau đó bạn chỉ đang xem một véc tơ hoặc length (nrow(df)) mỗi lần và không sao chép quá nhiều

df <- as.data.frame(lapply(df, function(x){replace(x, x <0,0)}) 

Đoạn mã trên phải khá hiệu quả.

Nếu bạn sử dụng data.table, thì phần lớn thời gian bộ nhớ (và) không hiệu quả của phương pháp data.frame bị xóa. Nó sẽ là lý tưởng cho một tình huống dữ liệu lớn như của bạn.

library(data.table) 
# this really shouldn't be 
DT <- lapply(df, function(x){replace(x, x <0,0)}) 
# change to data.table 
setattr(DT, 'class', c('data.table','data.frame')) 
# or 
# DT <- as.data.table(df, function(x){replace(x, x <0,0)}) 

Bạn có thể thiết lập phím trên tất cả các cột và sau đó thay thế bằng cách tham khảo cho các giá trị quan trọng ít hơn 0

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