2017-08-25 1 views
2

J'ai des données qui ressemble à ceci:En utilisant mutate_at() avec des aides de sélection niées par exemple (non 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)) 

Avec dplyr « s raflé les commandes que je peux éditer et de créer plusieurs colonnes à la fois, par exemple:

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

et si je veux le faire à un sous-ensemble de colonnes que je peux utiliser les aides select comme ceci:

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

Cependant, dans mon cas, je sais que mes données contiendront toujours les colonnes X1, X2 et ref mais aimeraient sous-ensemble des données de manière à muter uniquement les colonnes qui ne sont pas X1, X2 et ref. Ces autres colonnes seront variables en nombre et en nom mais toujours numériques. Je pensais que je pouvais faire quelque chose comme ceci:

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

ou peut-être

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

Mais ni travail. Comment faites-vous négatifs dplyr select helpers?

Répondre

3

Le one_of exige - et non !

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