R dplyr: Birden çok sütunu bırak


97

Bir veri çerçevem ​​ve bu veri çerçevesindeki bırakmak istediğim sütunların listesi var. irisVeri kümesini örnek olarak kullanalım . Ben kapatmak istiyorum Sepal.Lengthve Sepal.Widthsadece kalan sütunları kullanın. Nasıl kullanarak bunu yapıyorsunuz selectya select_gelen dplyrpaketin?

Şimdiye kadar denediklerim şunlar:

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

-Drop.cols'de hata: tekli operatör için geçersiz bağımsız değişken

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

-Drop.cols'de hata: tekli operatör için geçersiz bağımsız değişken

iris %>% select(!drop.cols)

Drop.cols'da hata: geçersiz bağımsız değişken türü

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

Drop.cols'da hata: geçersiz bağımsız değişken türü

Bariz bir şeyi kaçırdığımı hissediyorum çünkü bunlar zaten var olması gereken oldukça faydalı bir operasyon gibi görünüyor. Github'da birisi benzer bir sorun yayınladı ve Hadley 'negatif indeksleme' kullanmasını söyledi. Denediğim şey buydu, ama işe yaramadı. Herhangi bir öneri?

Yanıtlar:


129

Select_vars ile ilgili yardıma bakın. Bu, bununla nasıl çalışılacağı konusunda size bazı ekstra fikirler verir.

Senin durumunda:

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

Teşekkürler. Bazı nedenlerden dolayı, bu çalışıyor iris, ancak gerçek veri çerçevemde değil ( irisoyuncak bir örnekti). Veri çerçevem ​​4558 satır ve 147 sütun içeriyor. Aldığım hata mesajı idi Error in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes. Bunun neden olabileceğine dair bir fikriniz var mı?
Navaneethan Santhanam

1
Ah, bir hata yapmışım gibi görünüyor. Yanlışlıkla select_varsyerine kullandım select. Şimdi mükemmel çalışıyor!
Navaneethan Santhanam

6
Gibi dahili işlevler hakkında nerede bilgi bulmalıyız one_of? Bir şey eksik olmadıkça paket belgelerinde ( help(package='dplyr')) görünmez .
geotheory

4
@ geotheory, aslında one_of belgelenmiştir. bakın help(one_of, package = "dplyr"). En azından 0.5.0 paket sürümündedir. Ancak , Hadley'in paketlerinden birinde güncellemeler olduğunda gönderdiği blogları okumak yardımcı olur . Ve bazı işlevler diğer işlevlerin içinde belgelenmiştir. Ne yazık ki bu, işlevde hemen açık olmayan veya mümkün olmayan bir şey istediğimde çoğunlukla yaptığım tüm belgeleri okumayı gerektiriyor.
phiver

11
Teşekkürler. Dokümantasyon açısından ilk etapta bu işlevler hakkında nasıl bilgi edinebilirsiniz?
geotheory

72

Ayrıca denemek

## Notice the lack of quotes
iris %>% select (-c(Sepal.Length, Sepal.Width))

6
Harika! Konsoldan adları kopyalayıp yapıştırarak sütunları bırakmamız gerektiğinde gerçekten kullanışlıdır.
Pablo Casas

38

Bunun ötesinde select(-one_of(drop.cols)), select()tüm belirli sütun adlarını tanımlamayı içermeyen (sütun adlarında biraz daha çeşitlilik için dplyr starwars örnek verilerini kullanarak) sütunları düşürmek için birkaç seçenek daha vardır:

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(.))denk select_if(is.list(.))?
Jasha

3
Bu durumda ~, anonam olmayan bir işlevi tanımlamanın kısaltmasıdır, değil için başka bir simge değildir. Örneğin bu ikisi aynı anlama geliyor function(x) {!is.list(x)}ve~!is.list(.) . ~için bir kısaltma olarak düşünün function(.).
SlyFox

8

select()İşleve dikkat edin , çünkü hem dplyr hem de MASS paketlerinde kullanılır, bu nedenle MASS yüklüyse, select () düzgün çalışmayabilir. Hangi paketlerin yüklendiğini öğrenmek sessionInfo()için, "diğer ekli paketler:" bölümüne yazın ve arayın. Yüklenmişse, yazın detach( "package:MASS", unload = TRUE )ve select()işleviniz yeniden çalışmalıdır.


12
alternatif olarak, işleve doğrudan paket ad alanında erişebilirsiniz dplyr::select().
Triamus

2
Bu problemle çok sık karşılaşıyorum. Şimdi genellikle betiğimin üstünde yeni bir işlev tanımlıyorum dselect <- dplyr::select().
filups21

6

Deneyebiliriz

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

Teşekkürler @akrun, bu mükemmel çalıştı. Bununla birlikte, dplyrtemel analiz görevlerini okumayı ve yazmayı kolaylaştırma becerisini çevreleyen yutturmaca göz önüne alındığında, gerçek çözümün geçici bir çözüm gibi görünmesi beni hayal kırıklığına uğrattı.
Navaneethan Santhanam

@NavaneethanSanthanam Aslında, one_ofdiğer çözümdeki yol budur. Unuttum
akrun

3

Başka bir yol da istenmeyen sütunların dönüştürülmesidir NULL, bu gömülü parantezleri önler:

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

Bu ayrıca bir sütun yoksa bir uyarı vermez.
skoz

3

Sütun adlarında özel bir karakteriniz varsa , beklendiği gibi çalışabilir selectveya select_çalışmayabilir. Bu özellik dplyrkullanmanın ".". Sorudaki veri kümesine atıfta bulunmak için, bu sorunu çözmek için aşağıdaki satır kullanılabilir:

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

Yalnızca kod yanıtları önerilmez. Lütfen cevabın nasıl çalıştığına ve halihazırda mevcut cevaplardan nasıl farklı olduğuna dair biraz açıklama yapın.
Ralf Stubner

Teşekkür ederim!! Yukarıdaki diğer çözümlerin hiçbiri tam olarak bu nedenle işe yaramadı.
Marty999

0

Deneyebilirsin

iris %>% select(-!!drop.cols)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.