创建更新功能

时间:2015-02-27 19:37:55

标签: r dplyr

我想使用延迟评估和skranz的dplyrExtras中的mutate_if函数创建更新函数。

它的工作原理如下:

data %>%
  update(variable1_original = variable1_update,
         variable2_original = variable2_update)

将被评估为

data %>%
  mutate_if(!is.na(variable1_update), 
            variable1_original = variable1_update) %>%
  mutate_if(!is.na(variable2_update),
            variable2_original = variable2_update) %>%
  select(-variable1_update, variable2_update)

1 个答案:

答案 0 :(得分:1)

Yikes,这个包使用起来不是很有趣。 mutate_if似乎不适用于data.frames,并且该软件包没有像标准dplyr那样的函数的标准评估替代方案。这是尝试重新创建函数

myupdate <- function(.data, ...) {
    dots <- as.list(substitute(...()))
    dx <- Reduce(function(a,b) {
        upd <- b[[1]]
        ifc <- bquote(!is.na(.(upd)))
        do.call("mutate_if", c(list(a, ifc), b))
    }, split(dots, seq_along(dots)), .data)
    select_(dx, .dots=sapply(dots, function(x) bquote(-.(x))))
}

为了测试它,我使用了

library(data.table)
dd<-data.table(
   a = c(1:3, NA, 5:8)+0,
   b = c(1:2, NA, 4:5, NA, 7:8)+100,
   x= 1:8+20,
   y=1:8+30
)
dd
#     a   b  x  y
# 1:  1 101 21 31
# 2:  2 102 22 32
# 3:  3  NA 23 33
# 4: NA 104 24 34
# 5:  5 105 25 35
# 6:  6  NA 26 36
# 7:  7 107 27 37
# 8:  8 108 28 38

然后我跑了

myupdate(dd, x=b, y=a)
#      x  y
# 1: 101  1
# 2: 102  2
# 3:  23  3
# 4: 104 34
# 5: 105  5
# 6:  26  6
# 7: 107  7
# 8: 108  8

注意列“a”和“b”如何消失。另请参阅“x”列中第3行和第6行中的值以及“y”列中第4行中的值如何保留,因为“b”和“a”列中的相应值为NA。