programing

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

bestprogram 2023. 7. 16. 13:44

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개체입니다. 더 이상 작동하지 않습니다.

다음 중 하나가 열을 제거합니다.foo데이터 테이블에서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"부터df3(의 보기를 인쇄하는 것과 반대로)df3마이너스 열"foo"방법 1을 사용하는 것이 좋습니다.

(다음과 같은 방법을 사용하는 경우에는grep()또는grepl()설정해야 합니다.pattern="^foo$"보다는"foo"다음과 같은 이름의 열을 원하지 않는 경우"fool"그리고."buffoon"(즉, 다음을 포함하는 것)foo(부분 문자열로) 일치 및 제거됩니다.)

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

일치가 포함된 경우 다음 두 개의 관용구도 작동하지만 일치하지 않을 경우 예상치 못한 방식으로 실패합니다.예를 들어 이러한 열 중 하나를 사용하여 존재하지 않는 열을 검색하는 경우"bar"데이터 테이블이 0행이 될 것입니다.

따라서 하위 문자열이 포함된 이름의 열을 제외한 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.table루프 단위:

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]

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

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

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.frames가 열 목록으로 저장되므로 쉼표를 생략할 수 있습니다., 을 에추할수다합할니다야당의 해야 할 입니다.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