web-dev-qa-db-ja.com

存在する場合と存在しない場合がある列を選択するにはどうすればよいですか?

特定の列が存在する場合と存在しない場合があるデータフレームがあります。存在する場合は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

後者の場合、year列が存在しないため、boo列のあるデータフレームを返します。私の質問は、なぜ後者の場合に空のデータフレームを取得するのですか?これを回避し、望ましい結果を達成するための良い方法は何ですか?

[〜#〜] edit [〜#〜]:セッション情報

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    
21
Lyngbakr

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

期待される出力を与える

それ以外の場合、1つのオプションはone_ofを使用することです。

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

列が利用できない場合は警告メッセージを返します

他のオプションはmatchesです

df %>%
  select(matches("year|boo"))
16
akrun

dplyr::select_if()を使用して、Unknown columns:列名が存在しない場合に警告selectこの場合は 'bad_column':

df %>% 
  select_if(names(.) %in% c('year', 'bar', 'bad_column'))
0
sbha