에서 “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
data.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을 대신 사용하고 싶습니다.df3
df3
"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.table
in 루프 의 오버 헤드를 피할 수도 있습니다 .
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