创建更新函数
Create an update function
我想使用惰性求值和 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)
哎呀,那个包用起来不是很有趣。 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 .
我想使用惰性求值和 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)
哎呀,那个包用起来不是很有趣。 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 .