使用带有否定选择助手的mutate_at()例如(不是one_of())

G_T*_*G_T 5 r dplyr tidyverse

我有这样的数据:

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))
Run Code Online (Sandbox Code Playgroud)

使用dplyrscooped命令,我可以一次编辑和创建多个列,例如:

df %>% mutate_if(is.numeric, funs(new = . - ref))
Run Code Online (Sandbox Code Playgroud)

如果我想只对列的一个子集执行此操作,我可以select像这样使用帮助程序:

df %>% mutate_at(vars(one_of(c("X2", "ref"))), funs(new = . - ref))
Run Code Online (Sandbox Code Playgroud)

然而,在我来说,我知道我的数据总是包含列X1,X2ref但是想子集以这样的方式发生变异仅在非列中的数据X1,X2ref.这些其他列的编号和名称将是可变的,但始终为数字.我以为我可以这样做:

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

或者可能

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

但是没有工作.你如何做负面的dplyr select助手?

akr*_*run 8

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
Run Code Online (Sandbox Code Playgroud)