data.table에서 이름으로 열을 어떻게 삭제합니까?


196

에서 "foo"라는 열을 제거하려면 data.frame다음을 수행하십시오.

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

그러나 일단 객체 df로 변환 되면 data.table열을 제거하는 방법은 없습니다.

예:

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))] 

그러나 일단 data.table객체 로 변환되면 더 이상 작동하지 않습니다.


2
dt대신 data.table의 이름을 지정하는 것이 더 명확했을 것입니다 df3.
PatrickT

답변:


284

다음 중 하나가 foodata.table에서 열 을 제거 합니다 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.table 은 다음 구문도 지원합니다.

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

그러나 실제로 빼기 열 보기를 인쇄하는 대신 열 "foo"을 실제로 제거 하려면 방법 1을 대신 사용하고 싶습니다.df3df3"foo"

(마십시오 당신이 방법에 의존 사용하는 경우 있음 grep()또는 grepl(), 당신은 설정해야 pattern="^foo$"보다는 "foo"당신이 같은 이름을 가진 열을 원하지 않는 경우, "fool"그리고 "buffoon"(함유 한 것과 foo도 일치하고 제거 할) 문자열로합니다.)

덜 안전한 옵션, 대화식 사용에 적합 :

다음 두 관용구 ( 열 일치하는 항목이있는 경우)df3"foo" 도 작동 하지만 예상하지 못한 방식으로 실패 할 수 있습니다. 예를 들어, 존재하지 않는 column을 검색하기 위해 그중 하나를 사용하면 "bar"행이 0 인 data.table이됩니다.

결과적으로, 이들은 예를 들어, substring을 포함하는 이름을 가진 열을 빼고 data.table을 표시하려고하는 대화식 사용에 가장 적합합니다 "foo". 프로그래밍 목적으로 (또는 실제로 df3사본 에서 열 대신 열을 제거하려는 경우 ), 방법 1, 2a 및 2b가 실제로 가장 좋은 옵션입니다.

# Method 4:
df3[, .SD, .SDcols = !patterns("^foo$")]

마지막으로을 사용하는 접근 방식이 with=FALSE있지만 data.table점차이 인수를 사용하지 않기 때문에 피할 수있는 곳에서는 권장하지 않습니다. 옵션이 실제로 필요한 경우를 대비하여 여기에 표시하십시오.

# Method 5a (like Method 3)
df3[, !"foo", with=FALSE] 
# Method 5b (like Method 4)
df3[, !grep("^foo$", names(df3)), with=FALSE]
# Method 5b (another like Method 4)
df3[, !grepl("^foo$", names(df3)), with=FALSE]

2
-grepvs 에 대한 OP에 대한 내 의견을 참조하십시오 !grepl.
Joshua Ulrich

1
@JoshuaUlrich-좋은 지적입니다. grepl()data.table 열은 논리 벡터로 색인을 생성 할 수 없으므로 초기에 시도했지만 작동하지 않았습니다. 그러나 이제는 grepl()로 래핑하여 작동 which()하여 정수 벡터를 반환 할 수 있음을 알고 있습니다 .
Josh O'Brien

1
로 인덱싱하는 것에 대해 몰랐지만 data.table래핑하는 which것이 영리합니다!
Joshua Ulrich

6
나도 몰랐어요 data.table. FR # 1797을 추가했습니다 . 그러나 방법 1은 다른 방법보다 (거의) 무한히 빠릅니다. 방법 1은 참조없이 열을 전혀 제거하지 않습니다. 모든 크기의 데이터에 대해 0.005 초를 초과하는 것이 의심됩니다. 반대로, 다른 테이블은 삭제하려는 테이블을 제외하고 모두 복사하기 때문에 테이블이 RAM의 50 %에 가까운 경우 전혀 작동하지 않을 수 있습니다.
매트 Dowle

1
@ user3969377 문자 변수의 내용을 기준으로 열을 제거하려면 간단히 괄호로 묶으십시오. 즉. df [, (afoo) : = NULL]
딘 맥그리거

31

set이것을 사용 하여 [.data.tablein 루프 의 오버 헤드를 피할 수도 있습니다 .

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

열 이름으로 수행 which(colnames(dt) %in% c("a","c","e"))하려면 작동해야합니다 j.


2
에서 data.table당신이 열 이름을 수행하려는 경우 1.11.8, 직접 할 수 rm.col = c("a","b")dt[, (rm.col):=NULL]
두초

20

나는 단순히 데이터 프레임 종류의 방식으로 수행합니다.

DT$col = NULL

내가 빨리 볼 수있는 한 아무런 문제가 발생하지 않습니다.

업데이트 : $<-연산자 를 사용하면 객체 복사가 발생 하므로 DT가 매우 큰 경우 가장 좋은 방법은 아닙니다 . 더 나은 사용 :

DT[, col:=NULL]

8

데이터 테이블에서 삭제할 개별 열이 많고 모든 열 이름을 입력하지 않으려는 경우 매우 간단한 옵션 #careadviced

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

대신 열 번호를 기준으로 열이 제거됩니다.

data.table 장점을 무시하기 때문에 분명히 효율적이지 않지만 500,000 행 미만으로 작업하는 경우 제대로 작동합니다.


4

당신의 DT가 열이 가정 col1, col2, col3, col4, col5, coln.

하위 집합을 삭제하려면

vx <- as.character(bquote(c(col1, col2, col3, coln)))[-1]
DT[, paste0(vx):=NULL]

이 있어야한다 코멘트
Sachila Ranawaka

-2

다음은 열 이름에 사용법에 대한 함수가 주어지면 열 수를 NULL로 설정하려는 방법입니다.

deleteColsFromDataTable <- function (train, toDeleteColNames) {

       for (myNm in toDeleteColNames)

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

       return (train)
}


-7

data.table의 경우 열을 NULL로 할당하면 열이 제거됩니다.

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

... 이는 다음과 같습니다.

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

data.frame에 해당하는 것은 다음과 같습니다.

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

Q. data.table 버전에 쉼표가 있고 data.frame 버전에 쉼표가없는 이유는 무엇입니까?

A. data.frame이 열 목록으로 저장되므로 쉼표를 건너 뛸 수 있습니다. 에 추가 할 수도 있지만 NULLs 목록에을 (를) 할당해야합니다 DF[, c("col1", "col2", "col3")] <- list(NULL).


@ Arun data.frames행과 열이 전환되는 상황을 생각할 수 없습니다 . 비논리적 일 것입니다.
duHaas

@Arun 나는 당신의 첫 번째 코멘트가 당신이 전화를 걸었던 때가있는 것처럼 보이기 때문에 당신을 태그했습니다. DF[column,row]그래서 나는 이것이 실제로 일어난 인스턴스가 있는지보고 싶었습니다.
duHaas

오타를 제거하기 위해 답변을 업데이트했습니다.
Contango
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.