代码之家  ›  专栏  ›  技术社区  ›  G_T

将mutate\u at()与否定的选择辅助项一起使用,例如(不是()的一个)

  •  6
  • G_T  · 技术社区  · 8 年前

    我有如下数据:

    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 但希望以这样的方式对数据进行子集处理,以仅变异不属于 X1 X2 裁判 . 这些其他列的数字和名称是可变的,但始终是数字。我想我可以这样做:

    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

    1 回复  |  直到 8 年前
        1
  •  10
  •   akrun    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