[r] 이름별로 데이터 프레임 열 삭제

데이터 프레임에서 제거하려는 여러 열이 있습니다. 다음과 같은 것을 사용하여 개별적으로 삭제할 수 있음을 알고 있습니다.

df$x <- NULL

그러나 나는 더 적은 명령으로 이것을하기를 바랐다.

또한 정수 색인을 사용하여 다음과 같이 열을 삭제할 수 있음을 알고 있습니다.

df <- df[ -c(1, 3:6, 12) ]

그러나 변수의 상대 위치가 변경 될 수 있다고 걱정합니다.

R이 얼마나 강력한지를 감안할 때 각 열을 하나씩 삭제하는 것보다 더 좋은 방법이 있다고 생각했습니다.



답변

간단한 이름 목록을 사용할 수 있습니다.

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]

또는, 당신은 이름으로 유지하고 참조 할 사람들의 목록을 만들 수 있습니다 :

keeps <- c("y", "a")
DF[keeps]

편집 : 여전히 drop인덱싱 함수 의 인수에 익숙하지 않은 사람들 을 위해 하나의 열을 데이터 프레임으로 유지하려면 다음을 수행하십시오.

keeps <- "y"
DF[ , keeps, drop = FALSE]

drop=TRUE(또는 언급하지 않음) 불필요한 치수를 삭제하므로 column 값을 가진 벡터를 반환합니다 y.


답변

subset원하는 열을 알고있는 경우 유용한 명령 도 있습니다.

df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))

@hadley에 의한 주석 후 업데이트 : 열 a, c 를 삭제 하려면 다음을 수행하십시오.

df <- subset(df, select = -c(a, c))


답변

within(df, rm(x))

아마도 가장 쉬운 방법이거나 여러 변수가있는 경우 :

within(df, rm(x, y))

또는 data.tables를 다루는 경우 ( data.table에서 이름으로 열을 어떻게 삭제합니까? ) :

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

또는 여러 변수

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]


답변

다음 %in%과 같이 사용할 수 있습니다 .

df[, !(colnames(df) %in% c("x","bar","foo"))]


답변

list (NULL)도 작동합니다.

dat <- mtcars
colnames(dat)
# [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
# [11] "carb"
dat[,c("mpg","cyl","wt")] <- list(NULL)
colnames(dat)
# [1] "disp" "hp"   "drat" "qsec" "vs"   "am"   "gear" "carb"


답변

참조로 열을 제거하고 연관된 내부 복사를 피 data.frames하려면 data.table패키지와 함수를 사용할 수 있습니다:=

문자형 벡터 이름을 :=연산자 의 왼쪽 과 NULLRHS로 전달할 수 있습니다 .

library(data.table)

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# or more simply  DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10) #

DT[, c('a','b') := NULL]

호출 외부의 문자 벡터로 이름을 미리 정의하려면 [객체의 이름을 래핑 ()하거나 {}LHS가 범위 내의 이름이 아닌 호출 범위에서 평가되도록합니다 DT.

del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <-  <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.   

당신은 또한 사용할 수 set의 오버 헤드를 피할 수있는 [.data.table, 또한 작동 data.frames!

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)

# drop `a` from df (no copying involved)

set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)


답변

grep ()이 숫자 형 벡터를 반환한다는 사실을 기반으로 잠재적으로 더 강력한 전략이 있습니다. 내 데이터 세트 중 하나에서와 같이 긴 변수 목록이있는 경우 “.A”로 끝나는 일부 변수와 “.B”로 끝나는 일부 변수는 “.A”로 끝나는 변수 만 원합니다. 패턴과 일치하지 않는 모든 변수를 사용하여 다음을 수행하십시오.

dfrm2 <- dfrm[ , -grep("\\.B$", names(dfrm)) ]

이 경우 Joris Meys 예제를 사용하면 컴팩트하지는 않지만 다음과 같습니다.

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]