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.
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]
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
.
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]
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 dobrzeWarning: 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]
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)
}
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
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)
.
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