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

에서 “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객체 로 변환되면 더 이상 작동하지 않습니다.



답변

다음 중 하나가 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]


답변

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.


답변

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

DT$col = NULL

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

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

DT[, col:=NULL]


답변

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

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

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

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


답변

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

하위 집합을 삭제하려면

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


답변

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

deleteColsFromDataTable <- function (train, toDeleteColNames) {

       for (myNm in toDeleteColNames)

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

       return (train)
}


답변

DT[,c:=NULL] # remove column c