R dplyr : 여러 열 삭제


96

해당 데이터 프레임에 삭제하려는 데이터 프레임과 열 목록이 있습니다. 하자의 사용 iris예를 들어 데이터 집합을. 나는 드롭하고 싶습니다 Sepal.Length과 Sepal.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.