2017-08-25 26 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)) 

但是在我的情况我知道,我的数据总是包含列X1X2ref但想子集这样的数据变异仅在非X1X2ref列。这些其他列的数量和名称都是可变的,但始终是数字。我想我可以做这样的事情:

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