2012-10-11 10 views
17

Mam ramkę danych z 150 000 wierszy z 2000 kolumn zawierających wartości, niektóre z nich są negatywne. Zastępuję te wartości ujemne 0, ale jest to bardzo powolne (~ 60 min lub więcej).Szybkie zastępowanie wartości w ramce danych w R

df[df < 0] = 0

gdzie df[,1441:1453] wygląda (wszystkich kolumn/wartości liczbowych):

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 

Czy istnieje sposób, aby przyspieszyć ten proces, np tak jak ja to robię jest całkowicie wolny, a czy jest na to szybsze podejście? Dzięki.

+0

150.000 wierszy x 2000 kolumn: jest to poprawne –

+0

Czy możesz [pokazuje nam] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) jak wyglądają twoje dane? Czy wszystkie kolumny są numeryczne? – Roland

Odpowiedz

29

Spróbuj przekształcić plik DF w macierz.

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

Wiele. o wiele szybciej ! Dzięki –

+0

Naprawdę, naprawdę szybciej! –

21

Zarówno oryginalne podejście i aktualna odpowiedź utworzyć obiekt taki sam rozmiar jak m (lub df) podczas tworzenia m<0 (podejście matryca jest szybsza, ponieważ jest mniej kopiowanie wewnętrzny z [<- porównaniu z [<-.data.frame

można użyć lapply i replace, a potem szukasz tylko w wektorze lub length (nrow(df)) każdorazowo i nie kopiowanie tyle

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

Powyższy kod powinien być całkiem skuteczny.

Jeśli używasz data.table, wówczas większość nieefektywności czasu pamięci (i) podejścia data.frame zostanie usunięta. Byłoby to idealne rozwiązanie w przypadku dużej sytuacji danych, takiej jak Twoja.

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

Można ustawić klawisze na wszystkich kolumn i następnie zastąpienie przez odwołanie do kluczowych wartości mniejszej niż 0

Powiązane problemy