programing

이름별 데이터 프레임 열 삭제

bestprogram 2023. 6. 6. 10:25

이름별 데이터 프레임 열 삭제

데이터 프레임에서 제거할 열이 몇 개 있습니다.다음과 같은 방법을 사용하여 개별적으로 삭제할 수 있습니다.

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]

EDIT : 잘 입니다.drop인덱싱 함수의 인수를 사용하여 하나의 열을 데이터 프레임으로 유지하려면 다음 작업을 수행합니다.

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

drop=TRUE하지 않음) 합니다.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그리고 또한 일을 합니다!

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) )]

하나의 른다.dplyr정답.사용하다select(-column).

변수에 공통된 이름 구조가 있으면 다음과 같이 시도해 볼 수 있습니다.starts_with()를 들면.예를들면

library(dplyr)
df <- data.frame(var1 = rnorm(5), var2 = rnorm(5), var3 = rnorm (5), 
                 var4 = rnorm(5), char1 = rnorm(5), char2 = rnorm(5))
df
#        var2      char1        var4       var3       char2       var1
#1 -0.4629512 -0.3595079 -0.04763169  0.6398194  0.70996579 0.75879754
#2  0.5489027  0.1572841 -1.65313658 -1.3228020 -1.42785427 0.31168919
#3 -0.1707694 -0.9036500  0.47583030 -0.6636173  0.02116066 0.03983268

df1 <- df %>% select(-starts_with("char"))

df1
#        var2        var4       var3       var1
#1 -0.4629512 -0.04763169  0.6398194 0.75879754
#2  0.5489027 -1.65313658 -1.3228020 0.31168919
#3 -0.1707694  0.47583030 -0.6636173 0.03983268

프레임에서 는, 「 」 「 」 「 」 「 」 「 」를 하면 됩니다.:예를 들어, 삭제하려는 경우var2,var3그리고 그 사이에 있는 모든 변수들, 당신은 그냥 남겨질 것입니다.var1:

df2 <- df1 %>% select(-c(var2:var3) )  
df2
#        var1
#1 0.75879754
#2 0.31168919
#3 0.03983268

Dplyr 솔루션

여기서 이것이 많은 관심을 끌지는 의문이지만, 제거할 열 목록이 있고 나중에 제거하려면dplyr내가 사용하는 체인one_of()에 시대에select절:

다음은 단순하고 재현 가능한 예입니다.

undesired <- c('mpg', 'cyl', 'hp')

mtcars <- mtcars %>%
  select(-one_of(undesired))

는 문는다음실찾수있다니습을여행을 실행하여 수 .?one_of또는 여기:

http://genomicsclass.github.io/book/pages/dplyr_tutorial.html

또 다른 가능성:

df <- df[, setdiff(names(df), c("a", "c"))]

또는

df <- df[, grep('^(a|c)$', names(df), invert=TRUE)]
DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
DF

출력:

    x  y z  a
1   1 10 5 11
2   2  9 5 12
3   3  8 5 13
4   4  7 5 14
5   5  6 5 15
6   6  5 5 16
7   7  4 5 17
8   8  3 5 18
9   9  2 5 19
10 10  1 5 20

DF[c("a","x")] <- list(NULL)

출력:

        y z
    1  10 5
    2   9 5
    3   8 5
    4   7 5
    5   6 5
    6   5 5
    7   4 5
    8   3 5    
    9   2 5
    10  1 5

흥미롭게도, 이것은 R의 이상한 다중 구문 불일치 중 하나를 표시합니다.예를 들어 2열 데이터 프레임이 주어지면 다음과 같습니다.

df <- data.frame(x=1, y=2)

이것은 데이터 프레임을 제공합니다.

subset(df, select=-y)

하지만 이것은 벡터를 제공합니다.

df[,-2]

이 내용은 모두 에 설명되어 있습니다.?[정확히 예상된 행동은 아닙니다적어도 나한테는...

여기 있습니다.dplyr방법:

#df[ -c(1,3:6, 12) ]  # original
df.cut <- df %>% select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)  # with dplyr::select()

주석 없이 읽고 이해할 수 있는 직관적인 기능과 데이터 프레임 내에서 위치가 바뀌는 열에 강건한 기능을 제공하기 때문에 좋아합니다.또한 다음을 사용하여 벡터화된 관용구를 따릅니다.-요소를 제거합니다.

저는 계속해서 더 나은 관용구가 있을 것이라고 생각하지만, 이름에 의한 열 빼기를 위해 다음을 수행하는 경향이 있습니다.

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

# return everything except a and c
df <- df[,-match(c("a","c"),names(df))]
df

라는 기능이 있습니다dropNamed()의 Bernd Bischl's 서BBmisc정확히 이렇게 하는 패키지.

BBmisc::dropNamed(df, "x")

장점은 데이터 프레임 인수의 반복을 방지하기 때문에 파이프에 적합하다는 것입니다.magrittr (마치)처럼)dplyr접근 방식):

df %>% BBmisc::dropNamed("x")

위의 @hadley를 사용하지 않으려는 경우 다른 해결책: "COLUMN_NAME"이 삭제할 열의 이름인 경우:

df[,-which(names(df) == "COLUMN_NAME")]

너에머select(-one_of(drop_col_names))처럼, 두 다른 것이 있습니다.dplyr을 사용하여 을 놓기 위한 select()모든 특정 열 이름을 정의하지 않습니다(열 이름의 일부 다양성에 대해 dplyr starwars 샘플 데이터 사용).

library(dplyr)
starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  select(-contains('color')) %>%  # any column name that contains 'color'
  select(-starts_with('bi')) %>%  # any column name that starts with 'bi'
  select(-ends_with('er')) %>%    # any column name that ends with 'er'
  select(-matches('^f.+s$')) %>%  # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%     # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

프레임에 하지 않을 수도 있는 해야 할 데터프에있수있없고수을있도열는삭을다있수니약습반할간전여사이하용하제다경는음우을야해레임을도▁using▁▁that▁if▁slight▁column's▁a▁here▁a다,를 사용하여 약간 비틀어 보는 방법이 있습니다.select_if()▁using달리를 사용하는 .one_of()를 던지지 않을 입니다.Unknown columns:열 이름이 없는 경우 경고합니다.에서 '프레임에 이 아닙니다. " " 'bad_column'"은 "bad_column"입니다.

starwars %>% 
  select_if(!names(.) %in% c('height', 'mass', 'bad_column'))

데이터 프레임과 제거할 쉼표로 구분된 이름 문자열을 제공합니다.

remove_features <- function(df, features) {
  rem_vec <- unlist(strsplit(features, ', '))
  res <- df[,!(names(df) %in% rem_vec)]
  return(res)
}

용도:

remove_features(iris, "Sepal.Length, Petal.Width")

여기에 이미지 설명 입력

데이터 프레임의 열 이름을 기준으로 열을 삭제 및 삭제합니다.

A <- df[ , c("Name","Name1","Name2","Name3")]

당신이 할 수 있는 많은 방법들이 있습니다...

옵션-1:

df[ , -which(names(df) %in% c("name1","name2"))]

옵션-2:

df[!names(df) %in% c("name1", "name2")]

옵션-3:

subset(df, select=-c(name1,name2))

제찾기스를 사용하여 삭제할 .which에 음수기호를 합니다.*-1그런 다음 데이터 프레임에서 해당 값을 제거하는 부분 집합에서 값을 제거합니다.이것은 예입니다.

DF <- data.frame(one=c('a','b'), two=c('c', 'd'), three=c('e', 'f'), four=c('g', 'h'))
DF
#  one two three four
#1   a   d     f    i
#2   b   e     g    j

DF[which(names(DF) %in% c('two','three')) *-1]
#  one four
#1   a    g
#2   b    h

큰 사이즈가 있는 경우data.frame 메모리 이 적습니다.[ 또는열을 제거하기 위해 ,subset는 현재(R 3.6.2) 더 많은 메모리를 사용하고 있습니다. 대화형 사용 설명서의 힌트를 벗어나 있습니다.

getData <- function() {
  n <- 1e7
  set.seed(7)
  data.frame(a = runif(n), b = runif(n), c = runif(n), d = runif(n))
}

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- DF[setdiff(names(DF), c("a", "c"))] ##
#DF <- DF[!(names(DF) %in% c("a", "c"))] #Alternative
#DF <- DF[-match(c("a","c"),names(DF))]  #Alternative
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- subset(DF, select = -c(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#357 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- within(DF, rm(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF[c("a", "c")]  <- NULL ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

아직 게시되지 않은 다른 data.table 옵션은 특수 동사를 사용하는 것입니다..SD데이터의 부분 집합을 나타냅니다. .SDcols이름 또는 인덱스별로 열을 선택/삭제할 수 있는 인수입니다.

require(data.table)
# data
dt = data.table(
  A = LETTERS[1:5],
  B = 1:5,
  C = rep(TRUE, 5)
)
# delete B
dt[ , .SD, .SDcols =! 'B' ]
# delete all matches (i.e. all columns)
cols = grep('[A-Z]+', names(dt), value = TRUE)
dt[ , .SD, .SDcols =! cols ]

data.table에서 이러한 작업에 대한 모든 옵션의 요약을 찾을 수 있습니다.

df <- data.frame(
+   a=1:5,
+   b=6:10,
+   c=rep(22,5),
+   d=round(runif(5)*100, 2),
+   e=round(runif(5)*100, 2),
+   f=round(runif(5)*100, 2),
+   g=round(runif(5)*100, 2),
+   h=round(runif(5)*100, 2)
+ )
> df
  a  b  c     d     e     f     g     h
1 1  6 22 76.31 39.96 66.62 72.75 73.14
2 2  7 22 53.41 94.85 96.02 97.31 85.32
3 3  8 22 98.29 38.95 12.61 29.67 88.45
4 4  9 22 20.04 53.53 83.07 77.50 94.99
5 5 10 22  5.67  0.42 15.07 59.75 31.21

> # remove cols: d g h
> newDf <- df[, c(1:3, 5), drop=TRUE]
> newDf
  a  b  c     e
1 1  6 22 39.96
2 2  7 22 94.85
3 3  8 22 38.95
4 4  9 22 53.53
5 5 10 22  0.42

을 입니다.fselect붕괴 패키지에서.다음은 재현 가능한 예입니다.

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)

library(collapse)
fselect(DF, -z)
#>     x  y  a
#> 1   1 10 11
#> 2   2  9 12
#> 3   3  8 13
#> 4   4  7 14
#> 5   5  6 15
#> 6   6  5 16
#> 7   7  4 17
#> 8   8  3 18
#> 9   9  2 19
#> 10 10  1 20

repref v2.0.2를 사용하여 2022-08-26에 생성됨

언급URL : https://stackoverflow.com/questions/4605206/drop-data-frame-columns-by-name