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

包含两个变量的变异函数

  •  0
  • Dries  · 技术社区  · 7 年前

    如果我有一个像

    set.seed(1)    
    df <- data.frame(X = 5:14,
           Y = runif(10,0,1),
           Z = runif(10,0,1))
    

    我能做到

    df %>% mutate(Y = if_else(X > 10, -Y, Y),
                  Z = if_else(X > 10, -Z, Z))
    

    但是如果我有很多变量以相同的方式转换,我更喜欢使用MutaTyAt。但是,在这种情况下,我不能让它正常工作。

    我的尝试:

    testfun <- function(y){if_else(X > 10, -y, y)}
    df %>% mutate_at(vars(c("Y","Z")),funs(testfun))
    

    但这会导致 Evaluation error: object 'X' not found . 我试过像 get("X") ,但没用。有人知道有什么变化是有效的吗?

    2 回复  |  直到 7 年前
        1
  •  6
  •   talat    7 年前

    下面是一个简单的方法 mutate_at :

    library(dplyr)
    df %>% 
      mutate_at(vars(Y,Z), funs(if_else(X > 10, -., .)))
    
    #     X           Y          Z
    # 1   5  0.26550866  0.2059746
    # 2   6  0.37212390  0.1765568
    # 3   7  0.57285336  0.6870228
    # 4   8  0.90820779  0.3841037
    # 5   9  0.20168193  0.7698414
    # 6  10  0.89838968  0.4976992
    # 7  11 -0.94467527 -0.7176185
    # 8  12 -0.66079779 -0.9919061
    # 9  13 -0.62911404 -0.3800352
    # 10 14 -0.06178627 -0.7774452
    

    可复制数据:

    set.seed(1)
    df <- data.frame(X = 5:14,
                     Y = runif(10,0,1),
                     Z = runif(10,0,1))
    
        2
  •  0
  •   Dries    7 年前

    多亏了 docendo discimus answer 以上,我意识到如何使用预定义函数以这种方式(DOCENDOO的答案是完美的,我只是喜欢这样):

    testfun <- function(x,y){if_else(x>10, -y, y)}
    
    df%>%mutate_at(vars(Y,Z), funs(testfun(x=X,y=.))
    
    推荐文章