2017-08-25 3 views
2

否定選択ヘルパーなどとmutate_at()を使用して(ないONE_OFを())私はこのようになり、データを持っている

library(dplyr)  
set.seed(123) 

df <- data_frame(X1 = rep(LETTERS[1:4], 6), 
       X2 = rep(1:2, 12), 
       ref = sample(1:50, 24), 
       sampl1 = sample(1:50, 24), 
       var2 = sample(1:50, 24), 
       meas3 = sample(1:50, 24)) 

dplyrでは年代が、私が編集し、一度などで複数の列を作成することができますコマンドをスクープ:

df %>% mutate_if(is.numeric, funs(new = . - ref)) 

と私はそうのようなselectヘルパーを使用することができ、列のサブセットのみにこれをしたい場合:

df %>% mutate_at(vars(one_of(c("X2", "ref"))), funs(new = . - ref)) 

私の場合、私のデータには常にカラムX1,X2およびrefが含まれていますが、X1X2およびrefでないカラムだけを変更するような方法でデータをサブセット化したいと思います。これらの他の列は、数値と名前は可変ですが、常に数値です。

df %>% mutate_at(vars(!one_of(c("X1", "X2", "ref"))), funs(new = . - ref)) 

または多分

df %>% mutate_at(vars(one_of(!names %in% c("X1", "X2", "ref"))), funs(new = . - ref)) 

しかし、どちらも仕事:私はこのような何かを行うことができると思いました。否定的なdplyr selectヘルパーはどうやってやりますか?

答えて

3

one_of-なく!

df %>% 
    mutate_at(vars(-one_of(c("X1", "X2", "ref"))), funs(new = . - ref)) 
# A tibble: 24 x 9 
#  X1 X2 ref sampl1 var2 meas3 sampl1_new var2_new meas3_new 
# <chr> <int> <int> <int> <int> <int>  <int> <int>  <int> 
# 1  A  1 15  33 14 36   18  -1  21 
# 2  B  2 39  35 43  1   -4  4  -38 
# 3  C  1 20  27  3 23   7  -17   3 
# 4  D  2 42  28 21 11  -14  -21  -31 
# 5  A  1 44  14 37 18  -30  -7  -26 
# 6  B  2  3  7  6 28   4  3  25 
# 7  C  1 24  43 25 16   19  1  -8 
# 8  D  2 49  39  9  5  -10  -40  -44 
# 9  A  1 46  30 45 47  -16  -1   1 
#10  B  2 19  50 31 45   31  12  26 
が必要です
関連する問題