Programming

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

procodes 2020. 5. 18. 21:04
반응형

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.


I simply do it in the data frame kind of way:

DT$col = NULL

Works fast and as far as I could see doesn't cause any problems.

UPDATE: not the best method if your DT is very large, as using the $<- operator will lead to object copying. So better use:

DT[, col:=NULL]

Very simple option in case you have many individual columns to delete in a data table and you want to avoid typing in all column names #careadviced

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

This will remove columns based on column number instead.

It's obviously not as efficient because it bypasses data.table advantages but if you're working with less than say 500,000 rows it works fine


Suppose your dt has columns col1, col2, col3, col4, col5, coln.

To delete a subset of them:

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

Here is a way when you want to set a # of columns to NULL given their column names a function for your usage :)

deleteColsFromDataTable <- function (train, toDeleteColNames) {

   for (myNm in toDeleteColNames)

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

   return (train)

}


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

For a data.table, assigning the column to NULL removes it:

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

... which is the equivalent of:

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

The equivalent for a data.frame is:

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

Q. Why is there a comma in the version for data.table, and no comma in the version for data.frame?

A. As data.frames are stored as a list of columns, you can skip the comma. You could also add it in, however then you will need to assign them to a list of NULLs, DF[, c("col1", "col2", "col3")] <- list(NULL).

참고URL : https://stackoverflow.com/questions/9202413/how-do-you-delete-a-column-by-name-in-data-table

반응형