2014-08-29 10 views
9

Próbuję użyć data.table do przekodowania zmiennej na podstawie określonych warunków. Mój pierwotny zestaw danych zawiera około 30 milionów rekordów, a po wszystkim tworzenie zmiennych około 130 zmiennych. Użyłem metody proponowane tutaj: conditional statements in data.table(M1) i również tutaj data.table: Proper way to do create a conditional variable when column names are not known?(M2)Używanie instrukcji warunkowych w pliku data.table

Moim celem jest dostać równowartość poniższy kod, ale coś, co jest stosowane przy użyciu data.table

samp$lf5 <- samp$loadfactor5 

samp$lf5 <- with(samp, ifelse(loadfactor5 < 0, 0, lf5)) 

Przyznam, że nie rozumiem. SD i .SDCols bardzo dobrze, więc mogę używać go źle. Kod i błędy z (M1) i (M2) są podane poniżej, a zbiór danych próbka jest tutaj: http://goo.gl/Jp97Wn

(M1)

samp[,lf5 = if(loadfactor5 <0) 0 else loadfactor5] 

Komunikat o błędzie

Error in `[.data.table`(samp, , lf5 = if (loadfactor5 < 0) 0 else loadfactor5) : 
unused argument (lf5 = if (loadfactor5 < 0) 0 else loadfactor5) 

Kiedy to zrobię:

samp[,list(lf5 = if(loadfactor5 <0) 0 else loadfactor5)] 

daje LF5 postaci listy, ale nie jako część samp data.table i tak naprawdę nie stosuje się warunku jako LF5 nadal ma wartości mniejsze niż 0.

(M2)

Col1 <- "loadfactor5" 
Col2 <- "lf5" 

setkeyv(samp,Col1) 
samp[,(Col2) :=.SD,.SDCols = Col1][Col1<0,(Col2) := .SD, .SDcols = 0] 

otrzymuję następujący błąd

Error in `[.data.table`(samp, , `:=`((Col2), .SD), .SDCols = Col1) : 
unused argument (.SDCols = Col1) 

Wszelkie spostrzeżenia na temat sposobu, aby zakończyć to doceniane. Mój zbiór danych zawiera 30M rekordów, więc mam nadzieję, że wykorzystam data.table, aby naprawdę skrócić czas działania.

Dzięki,

Krishnan

+2

'samp [, lf5: = ifelse (loadfactor5 <0, 0, loadfactor5)]'; wyszukaj '.SD' na SO, aby dowiedzieć się, co to jest/robi – eddi

+0

Udało mi się użyć tego polecenia, aby uzyskać pożądany wynik. – Krishnan

+0

@Krishnan, czy mógłbyś odpowiedzieć sam i zaakceptować to tak, że odpowiedź Q pozostaje? Dzięki. – Arun

Odpowiedz

17

Odpowiedź udzielana przez eddi i zawarte tutaj w trosce o kompletność.

samp[, lf5 := ifelse(loadfactor5 < 0, 0, loadfactor5)]

+1

Myślę, że quid pytania jest użycie ": =" zamiast "=".Możesz również napisać samp [, lf5: = loadfactor5 * (loadfactor> = 0)] – skan

2

Innym sposobem (które wolę, bo to, moim zdaniem, odkurzacz):

samp[, lf5 := 0]; samp[loadfactor5 > 0, lf5 := loadfactor5]; 

używam data.table z zestawu danych z 90M wierszy; Ciągle jestem zdumiony tym, jak szybka jest data.table dla operacji takich jak powyższe.

+0

Mam datatable z 12M wierszy i muszę zmodyfikować pola i kiedy robię dt [, TYPE: = ifelse (is.na (TYPE) == TRUE, "NONE", TYPE)] trwa 7 sekund, czyli tyle ile zajmuje dplyr. Czy to może być jakoś przyspieszone? – user3022875

Powiązane problemy