Transformacja klas kolumn *some* w data.table
Chcę przekonwertować podzbiór data.table siodła do nowej klasy. Jest popularne pytanie /
https://coderoad.ru/7813578/
/, Ale odpowiedź tworzy nowy obiekt i nie działa z obiektem początkowym.
Weź tego przykładu:
Jak najlepiej konwertować tylko kolumny
w /na przykład/ czynnik? W zwykłej data.frame Mogłaś to zrobić:
Ale to nie działa data.table, I też nie działa
Komentarz w związku z tym pytanie Matt Dowla /Od grudnia 2013 roku/ Zakłada, że następujące prace normalnie, ale wydaje się trochę mniej eleganckie.
Czy jest obecnie najlepsza odpowiedź data.table /I.E. Krótszy + nie generuje zmiennej licznika/, Lub powinienem po prostu użyć powyższego +
?
https://coderoad.ru/7813578/
/, Ale odpowiedź tworzy nowy obiekt i nie działa z obiektem początkowym.
Weź tego przykładu:
dat <- data.frame/ID=c/rep/"A", 5/, rep/"B",5//, Quarter=c/1:5, 1:5/, value=rnorm/10//
cols <- c/'ID', 'Quarter'/
Jak najlepiej konwertować tylko kolumny
cols
w /na przykład/ czynnik? W zwykłej data.frame Mogłaś to zrobić:
dat[, cols] <- lapply/dat[, cols], factor/
Ale to nie działa data.table, I też nie działa
dat[, .SD := lapply/.SD, factor/, .SDcols = cols]
Komentarz w związku z tym pytanie Matt Dowla /Od grudnia 2013 roku/ Zakłada, że następujące prace normalnie, ale wydaje się trochę mniej eleganckie.
for /j in cols/ set/dat, j = j, value = factor/dat[[j]]//
Czy jest obecnie najlepsza odpowiedź data.table /I.E. Krótszy + nie generuje zmiennej licznika/, Lub powinienem po prostu użyć powyższego +
rm/j/
?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
2 odpowiedzi
Marian
Potwierdzenie od:
dat[, /cols/ := lapply/.SD, factor/, .SDcols = cols]
Za pomocą operatora.
, Aktualizujesz datatable połączyć. I czy działał, czy działało:
Jak zaproponowano @MattDowle W komentarzach można również użyć kombinacji
w następujący sposób:
Co da ten sam wynik. Trzecią opcją jest:
Na parametrze małych zestawów danych
około trzy razy szybciej niż parametr
/Ale to nie ma znaczenia, ponieważ jest to mały zestaw danych./. Na dużych zestawach danych /na przykład, 2 Milion Row/ Każde z tych podejść zajmuje mniej więcej tak samo. Do testowania w większym zestawie danych używałem:
Czasami musisz to zrobić trochę innego /Na przykład, gdy wartości liczbowe są przechowywane jako czynnik/. Wtedy musisz użyć czegoś takiego:
dat[, /cols/ := lapply/.SD, function/x/ as.integer/as.character/x///, .SDcols = cols]
WARNING:
Następujące wyjaśnienie
nie
to A.
- Wyczyść rzeczy do zrobienia rzeczy. datatable nie aktualizowany przez odniesienie, ponieważ kopia jest tworzona i przechowywana w pamięci /Jak wskazano @Frank/,, Co zwiększa użycie pamięci. Jest to bardziej jak dodatek do wyjaśnienia pracy
.
Jeśli chcesz zmienić klasy kolumn, tak jak to zrobiłeś dataframe, Musisz dodać
w następujący sposób:
I czy działał, czy działało:
Jeśli nie dodasz
, że datatable oceni się
dat[, cols]
jako wektor. Sprawdź różnicę w wyjściu między
dat[, cols]
i
dat[, cols, with = FALSE]
:
Paweł
Potwierdzenie od:
: