[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.table
s를 다루는 경우 ( 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
패키지와 함수를 사용할 수 있습니다:=
문자형 벡터 이름을 :=
연산자 의 왼쪽 과 NULL
RHS로 전달할 수 있습니다 .
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) )]