Jak usunąć kolumnę według nazwy w danych.stolik?

Aby pozbyć się kolumny o nazwie " foo " w data.frame, Mogę zrobić:

df <- df[-grep('foo', colnames(df))]

Jednak po przekonwertowaniu df Na obiekt data.table, nie ma sposobu na usunięcie kolumny.

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 przekonwertowaniu na obiekt data.table, to już nie działa.

 155
Author: Henrik, 2012-02-09

8 answers

Dowolna z poniższych wartości usunie kolumnę foo z danych.Tabela df3:

# Method 1 (and preferred as it takes 0.00s even on a 20GB data.table)
df3[,foo:=NULL]

df3[, c("foo","bar"):=NULL]  # remove two columns

myVar = "foo"
df3[, (myVar):=NULL]   # lookup myVar contents

# Method 2a -- A safe idiom for excluding (possibly multiple)
# columns matching a regex
df3[, grep("^foo$", colnames(df3)):=NULL]

# Method 2b -- An alternative to 2a, also "safe" in the sense described below
df3[, which(grepl("^foo$", colnames(df3))):=NULL]

Data.tabela obsługuje również następującą składnię:

## Method 3 (could then assign to df3, 
df3[, !"foo", with=FALSE]  

Chociaż jeśli rzeczywiście chcesz usunąć kolumnę "foo" z df3 (w przeciwieństwie do drukowania widoku df3 minus kolumna "foo"), naprawdę chcesz użyć metody 1.

(zwróć uwagę, że jeśli używasz metody opartej na grep() lub grepl(), musisz ustawić pattern="^foo$" zamiast "foo", jeśli nie chcesz kolumny o nazwach takich jak "fool" i "buffoon" (tj. te zawierające foo jako podłańcuch), które mają być dopasowane i usunięte.)

Mniej bezpiecznych opcji, dobrze do interaktywnego użytku:

Następne dwa idiomy również zadziałają -- Jeśli df3 zawiera dopasowaną kolumnę"foo" -- ale zawiedzie w prawdopodobnie nieoczekiwany sposób, jeśli nie. Jeśli na przykład użyjesz jednej z nich do wyszukania nieistniejącej kolumny "bar", skończysz z danymi z zerowego wiersza.stolik.

Jako konsekwencja, są one naprawdę najlepiej nadają się do interaktywnego użytku, gdzie można, na przykład, chcesz wyświetlić dane.tabela minus dowolne kolumny z nazwami zawierającymi podłańcuch "foo". Dla celów programistycznych (lub jeśli chcesz usunąć kolumny z df3, a nie z ich kopii), metody 1, 2a i 2b są naprawdę najlepszymi opcjami.

# Method 4a:
df3[, -grep("^foo$", colnames(df3)), with=FALSE]

# Method 4b: 
df3[, !grepl("^foo$", colnames(df3)), with=FALSE]
 226
Author: Josh O'Brien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 02:39:59

Możesz również użyć set do tego, co pozwala uniknąć napowietrzności [.data.table w pętlach:

dt <- data.table( a=letters, b=LETTERS, c=seq(26), d=letters, e=letters )
set( dt, j=c(1L,3L,5L), value=NULL )
> dt[1:5]
   b d
1: A a
2: B b
3: C c
4: D d
5: E e

Jeśli chcesz to zrobić po nazwie kolumny, {[3] } powinno działać dla j.

 26
Author: Ari B. Friedman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-21 22:41:38

Po prostu robię to w sposób ramki danych:

DT$col = NULL

Działa szybko i z tego co widzę nie sprawia żadnych problemów.

UPDATE: nie najlepsza metoda, jeśli twój DT jest bardzo duży, ponieważ użycie operatora $<- doprowadzi do kopiowania obiektów. Więc lepiej używać:

DT[, col:=NULL]
 15
Author: msp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 09:34:50

Bardzo prosta opcja w przypadku, gdy masz wiele pojedynczych kolumn do usunięcia w tabeli danych i chcesz uniknąć wpisywania wszystkich nazw kolumn #careadviced

dt <- dt[, -c(1,4,6,17,83,104), with =F]

Usunie kolumny na podstawie numeru 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
 2
Author: SJDS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-03 02:02:58

Załóżmy, że Twój dt ma kolumny col1, col2, col3, col4, col5, coln.

Aby usunąć ich podzbiór:

vx <- as.character(bquote(c(col1, col2, col3, coln)))[-1]
DT[, paste0(vx):=NULL]
 0
Author: Ricardo Paixao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 07:32:22

Oto sposób, gdy chcesz ustawić # kolumn na NULL, biorąc pod uwagę ich nazwy kolumn funkcja do użytku:)

DeleteColsFromDataTable

   for (myNm in toDeleteColNames)

   train <- train [,(myNm):=NULL,with=F]

   return (train)

}

 -2
Author: user3531326,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-14 09:22:53
DT[,c:=NULL] # remove column c
 -2
Author: Durga Gaddam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 04:50:16

Dla danych.tabela, przypisanie kolumny do NULL usuwa ją:

DT[,c("col1", "col1", "col2", "col2")] <- NULL
^
|---- Notice the extra comma if DT is a data.table

... który jest odpowiednikiem:

DT$col1 <- NULL
DT$col2 <- NULL
DT$col3 <- NULL
DT$col4 <- NULL

Odpowiednik dla danych.ramka to:

DF[c("col1", "col1", "col2", "col2")] <- NULL
      ^
      |---- Notice the missing comma if DF is a data.frame

Q. dlaczego w wersji jest przecinek dla danych.tabeli, oraz brak przecinka w wersji dla danych.rama?

A. jako data.ramki są przechowywane jako lista kolumn, można pominąć przecinek. Można je również dodać, jednak wtedy trzeba będzie przypisać je do listy NULL s, DF[, c("col1", "col2", "col3")] <- list(NULL).

 -7
Author: Contango,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-04 13:39:14