R dplyr : 여러 열 삭제


96

해당 데이터 프레임에 삭제하려는 데이터 프레임과 열 목록이 있습니다. 하자의 사용 iris예를 들어 데이터 집합을. 나는 드롭하고 싶습니다 Sepal.LengthSepal.Width만 나머지 열을 사용합니다. 패키지를 사용 select하거나 패키지 select_에서 어떻게 수행 dplyr합니까?

지금까지 시도한 내용은 다음과 같습니다.

drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)

-drop.cols 오류 : 단항 연산자에 대한 잘못된 인수

iris %>% select_(.dots = -drop.cols)

-drop.cols 오류 : 단항 연산자에 대한 잘못된 인수

iris %>% select(!drop.cols)

! drop.cols 오류 : 잘못된 인수 유형

iris %>% select_(.dots = !drop.cols)

! drop.cols 오류 : 잘못된 인수 유형

이미 존재해야하는 꽤 유용한 작업처럼 보이기 때문에 분명한 것을 놓치고있는 것 같습니다. Github에서 누군가 비슷한 문제를 게시 했고 Hadley는 '네거티브 인덱싱'을 사용한다고 말했습니다. 그게 (내 생각에) 시도했지만 아무 소용이 없습니다. 어떤 제안?

답변:


127

select_vars에 대한 도움말을 확인하십시오. 이것으로 작업하는 방법에 대한 몇 가지 추가 아이디어를 제공합니다.

귀하의 경우 :

iris %>% select(-one_of(drop.cols))

감사. 어떤 이유로, 이것은 iris실제 데이터 프레임이 아닌에서 작동합니다 ( iris장난감 예제였습니다). 내 데이터 프레임에는 4558 개의 행과 147 개의 열이 있습니다. 받은 오류 메시지는 Error in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes입니다. 왜 이런 일이 일어나는지 아십니까?
Navaneethan Santhanam

1
아, 제가 실수 한 것 같습니다. select_vars대신 실수 로 select. 이제 완벽하게 작동합니다!
Navaneethan Santhanam

5
내장 함수에 대해 어디에서 알아 내야 one_of합니까? 내가 빠진 것이 없다면 패키지 문서 ( help(package='dplyr'))에 나타나지 않습니다 .
지리학 jul.

4
@geotheory, 실제로 one_of가 문서화되어 있습니다. 참조하십시오 help(one_of, package = "dplyr"). 적어도 패키지 버전 0.5.0입니다. 그러나 Hadley가 자신의 패키지 중 하나에 업데이트가있을 때 게시 하는 블로그 를 읽는 것은 도움이 됩니다. 그리고 일부 기능은 다른 기능 내에 문서화되어 있습니다. 안타깝게도 모든 문서를 읽어야하는데,이 기능으로 즉시 명확하지 않거나 가능하지 않은 것을 원할 때 주로 수행합니다.
phiver

10
감사. 문서 측면에서 처음에 이러한 기능에 대해 어떻게 알 수 있습니까?
geotheory


37

그 외에도 모든 특정 열 이름을 정의하지 않는 select(-one_of(drop.cols))사용하여 열을 삭제하는 몇 가지 다른 옵션이 있습니다 select()(열 이름의 다양성에 대해 dplyr starwars 샘플 데이터 사용).

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 

인가 select_if(~!is.list(.))에 해당 select_if(is.list(.))?
Jasha

3
이 경우 ~에는 익명 함수를 정의하는 약칭이며, 그렇지 않다는 또 다른 상징이 아닙니다. 예를 들어이 두 가지가 동일한 것을 의미 function(x) {!is.list(x)}하고 ~!is.list(.). 의 ~약자로 생각하십시오 function(.).
SlyFox

8

select()dplyr 및 MASS 패키지에서 모두 사용되므로 함수에 주의하십시오 . 따라서 MASS가로드되면 select ()가 제대로 작동하지 않을 수 있습니다. 로드 sessionInfo()된 패키지를 확인하려면 "다른 첨부 된 패키지 :"섹션에서 해당 패키지를 입력 하고 찾으십시오. 로드 된 경우을 입력 detach( "package:MASS", unload = TRUE )하면 select()함수가 다시 작동합니다.


12
또는 패키지 네임 스페이스에서 직접 함수에 액세스 할 수 있습니다 dplyr::select().
Triamus

2
이 문제를 너무 자주 겪었습니다. 이제 저는 보통 스크립트 상단에 새로운 함수를 정의합니다 dselect <- dplyr::select().
filups21

5

우리는 시도 할 수 있습니다

iris %>% 
      select_(.dots= setdiff(names(.),drop.cols))

감사합니다 @akrun, 이것은 완벽하게 작동했습니다. 그러나 dplyr기본적인 분석 작업을 쉽게 읽고 쓸 수있는 능력을 둘러싼 과대 광고를 감안할 때 실제 솔루션이 해결 방법처럼 보이는 것에 실망했습니다.
Navaneethan Santhanam

@NavaneethanSanthanam 사실, one_of다른 해결책은 갈 길입니다. 나는 그것을 잊었다.
akrun

3

또 다른 방법은 원하지 않는 열을로 변경하는 것입니다 NULL. 이렇게하면 삽입 된 괄호를 피할 수 있습니다.

head(iris,2) %>% mutate_at(drop.cols, ~NULL)
#   Petal.Length Petal.Width Species
# 1          1.4         0.2  setosa
# 2          1.4         0.2  setosa

또한 열이 없으면 경고를 표시하지 않습니다.
skoz

3

열 이름에 특수 문자가있는 경우 select또는 select_예상대로 작동하지 않을 수 있습니다. 이 재산 dplyr의 사용 ".". 질문의 데이터 세트를 참조하기 위해 다음 행을 사용하여이 문제를 해결할 수 있습니다.

drop.cols <- c('Sepal.Length', 'Sepal.Width')
  iris %>% .[,setdiff(names(.),drop.cols)]

코드 전용 답변은 권장되지 않습니다. 답변이 작동하는 방식과 이미 제시된 답변과 어떻게 다른지에 대한 설명을 제공해주세요.
Ralf Stubner

감사합니다!! 위의 다른 솔루션은 이러한 정확한 이유로 작동하지 않았습니다.
Marty999 19

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.