2012-10-11 124 views
17

我有一個150,000行的數據框,其中有2000列包含值,其中一些爲負值。 我將這些負值替換爲0,但這樣做非常緩慢(~60分鐘或更長)。快速替換R中的數據幀中的值

df[df < 0] = 0

其中df[,1441:1453]樣子(所有列/值的數字):

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 

有沒有一種方法可以加快這種過程中,如我這樣做的方式是完全緩慢,有更快的方法呢? 謝謝。

+0

150000行×2000列:這是正確的 –

+0

能否請您[告訴我們](HTTP:/ /stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)你的數據是怎樣的?所有列都是數字嗎? – Roland

回答

29

嘗試將您的df轉換爲矩陣。

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

很多。快多了 !謝謝 –

+0

真的很快! –

21

無論你原來的做法和當前的回答創建一個對象的大小m(或df)與創建m<0時(矩陣的方法是更快,因爲有較少的內部複製與[<-[<-.data.frame

比較

您可以使用lapplyreplace,那麼你就只能看着每次 向量或length (nrow(df)),而不是複製這麼多

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

上面的代碼應該是相當有效的。

如果使用data.table,那麼data.frame方法的大部分內存(和)時間效率都會被刪除。這對於像您這樣的大數據情況來說是理想的選擇。

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)}) 

您可以爲所有列鍵,然後通過參考替換關鍵值小於0