Aby pozbyć się kolumny o nazwie „foo” w data.frame
, mogę:
df <- df[-grep('foo', colnames(df))]
Jednak po df
przekonwertowaniu na data.table
obiekt nie ma sposobu, aby po prostu usunąć kolumnę.
Przykład:
df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))]
Ale po przekształceniu w data.table
obiekt nie działa.
r
data.table
Maiasaura
źródło
źródło
dt
zamiastdf3
...Odpowiedzi:
Każda z poniższych czynności spowoduje usunięcie kolumny
foo
z tabeli data.tabledf3
:data.table obsługuje również następującą składnię:
ale jeśli rzeczywiście chce usunąć kolumnę
"foo"
zdf3
(a nie tylko drukowanie widokdf3
minus kolumny"foo"
), które tak naprawdę nie chcą korzystać z metody 1 zamiast.(Pamiętaj, że jeśli używasz metody polegającej na
grep()
lubgrepl()
, musiszpattern="^foo$"
raczej ustawić , niż"foo"
, jeśli nie chcesz, aby kolumny o nazwach takich jak"fool"
i"buffoon"
(tj. Zawierającefoo
jako podłańcuch) również były dopasowywane i usuwane).Mniej bezpieczne opcje, w porządku do użytku interaktywnego:
Kolejne dwa idiomy również będą działać - jeśli
df3
zawiera dopasowanie do kolumny"foo"
- ale zakończy się niepowodzeniem w prawdopodobnie nieoczekiwany sposób, jeśli nie będzie. Jeśli, na przykład, użyjesz któregoś z nich do wyszukania nieistniejącej kolumny"bar"
, skończysz na zerowym wierszu data.table.W rezultacie najlepiej nadają się do użytku interaktywnego, w którym można np. Wyświetlić tabelę data.tab pomniejszoną o kolumny zawierające nazwy zawierające podłańcuch
"foo"
. Do celów programistycznych (lub jeśli chcesz faktycznie usunąć kolumnydf3
z kopii, a nie z jej kopii), Metody 1, 2a i 2b są naprawdę najlepszymi opcjami.Wreszcie istnieją podejścia wykorzystujące
with=FALSE
, choćdata.table
stopniowo odchodzi od używania tego argumentu, więc odradza się, gdzie można tego uniknąć; pokazując tutaj, abyś wiedział, że istnieje opcja na wypadek, gdybyś naprawdę jej potrzebował:źródło
-grep
kontra!grepl
.grepl()
początkowo i to nie zadziałało, ponieważ kolumn data.table nie można indeksować za pomocą wektora logicznego. Ale teraz zdaję sobie sprawę, żegrepl()
można sprawić, by działał, owijając gowhich()
tak, aby zwracał wektor liczb całkowitych.data.table
, ale spakowanie gowhich
jest sprytne!data.table
; dodano FR # 1797 . Ale metoda 1 jest (prawie) nieskończenie szybsza niż inne. Metoda 1 usuwa kolumnę przez odniesienie bez żadnej kopii. Wątpię, czy otrzymujesz go powyżej 0,005 sekundy dla dowolnej wielkości danych. Tabela. Z kolei inne mogą w ogóle nie działać, jeśli tabela zawiera prawie 50% pamięci RAM, ponieważ kopiują wszystkie oprócz tej do usunięcia.Możesz również użyć
set
do tego celu, co pozwala uniknąć narzutu[.data.table
w pętlach:Jeśli chcesz to zrobić według nazwy kolumny,
which(colnames(dt) %in% c("a","c","e"))
powinno działaćj
.źródło
data.table
1.11.8, jeśli chcesz to zrobić według nazwy kolumny, możesz to zrobić bezpośredniorm.col = c("a","b")
idt[, (rm.col):=NULL]
Po prostu robię to w sposób podobny do ramki danych:
Działa szybko i o ile wiem, nie powoduje żadnych problemów.
AKTUALIZACJA: nie najlepsza metoda, jeśli ID jest bardzo duży, ponieważ użycie
$<-
operatora doprowadzi do kopiowania obiektów. Więc lepiej użyj:źródło
Bardzo prosta opcja, jeśli masz wiele pojedynczych kolumn do usunięcia w tabeli danych i chcesz uniknąć wpisywania wszystkich nazw kolumn #careadviced
Spowoduje to usunięcie kolumn opartych na numerze kolumny.
Oczywiście nie jest tak wydajny, ponieważ omija dane. Zalety tabeli, ale jeśli pracujesz z mniej niż powiedzmy 500 000 wierszy, działa dobrze
źródło
Załóżmy, że dt ma kolumn
col1
,col2
,col3
,col4
,col5
,coln
.Aby usunąć ich podzbiór:
źródło
Oto sposób, w jaki chcesz ustawić liczbę kolumn na NULL, biorąc pod uwagę, że nazwy ich kolumn mają funkcję do użytku :)
źródło
źródło
W przypadku data.table przypisanie kolumny do NULL powoduje jej usunięcie:
... co jest odpowiednikiem:
Odpowiednikiem dla data.frame jest:
P: Dlaczego w wersji dla data.table występuje przecinek, aw wersji dla data.frame nie ma przecinka?
A. Ponieważ ramki danych są przechowywane jako lista kolumn, możesz pominąć przecinek. Można również dodać je jednak wtedy trzeba będzie przypisać je do listy
NULL
sDF[, c("col1", "col2", "col3")] <- list(NULL)
.źródło
data.frames
której wiersz i kolumny byłyby przełączane. To byłoby nielogiczne.DF[column,row]
więc chciałem tylko sprawdzić, czy rzeczywiście są jakieś przypadki, w których to się wydarzyło.