2017-05-04 54 views
3

我有一個數據框,可能會或可能不會有一些特定的列存在。如果他們確實存在,我想選擇使用dplyr的列,如果不存在,只是忽略我試圖選擇它們。這裏有一個例子:如何選擇可能存在或不存在的列?

# Load libraries 
library(dplyr) 

# Create data frame 
df <- data.frame(year = 2000:2010, foo = 0:10, bar = 10:20) 

# Pull out some columns 
df %>% select(year, contains("bar")) 

# Result 
# year bar 
# 1 2000 10 
# 2 2001 11 
# 3 2002 12 
# 4 2003 13 
# 5 2004 14 
# 6 2005 15 
# 7 2006 16 
# 8 2007 17 
# 9 2008 18 
# 10 2009 19 
# 11 2010 20 

# Try again for non-existent column 
df %>% select(year, contains("boo")) 

# Result 
#data frame with 0 columns and 11 rows 

在後一種情況下,我只是想,因爲列boo不存在同列year返回的數據幀。我的問題是爲什麼我會在後一種情況下得到一個空的數據框,以及避免這種情況並達到預期結果的好方法?

編輯:會話信息

R version 3.3.3 (2017-03-06) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] dplyr_0.5.0 

loaded via a namespace (and not attached): 
[1] lazyeval_0.2.0 magrittr_1.5  R6_2.2.0   assertthat_0.2.0 DBI_0.6-1  tools_3.3.3  
[7] tibble_1.3.0  Rcpp_0.12.10  
+0

我不能重現此錯誤與我的版本dplyr的返回一條警告消息。你能分享'sessionInfo()'的結果嗎?另外,你是否可以嘗試從GitHub('devtools :: install_github(「tidyverse/dplyr」)')安裝dplyr的開發版本並查看是否修復了它? –

+0

我已將會話信息添加到原始問題。 – Lyngbakr

+0

它給出了dplyr'0.5.0.9001'的正確輸出。 – mt1022

回答

6

dplyr

df %>% 
    select(year, contains("boo")) 
#  year 
#1 2000 
#2 2001 
#3 2002 
#4 2003 
#5 2004 
#6 2005 
#7 2006 
#8 2007 
#9 2008 
#10 2009 
#11 2010 

的devel的版本給出了預期的輸出

否則一個選項是使用one_of

df %>% 
    select(one_of("year", "boo")) 

,如果列不可

其他選項是matches

df %>% 
    select(matches("year|boo")) 
+0

我不認爲這回答了這個問題,這是關於dplyr中的一個明顯的錯誤。 'select(year,contains(「boo」))'應該在輸出中包含'year'。 –

+1

@Patronus我展示了一種獲得預期輸出的方法。他的問題是「我只是想返回一個數據框,因爲列不存在」。 – akrun

相關問題