我正在尝试编写一个将包装的函数dplyr::coalesce()
,并将接受数据对象和列名称来合并。到目前为止,我的尝试都失败了。
示例数据
library(dplyr)
df <-
data.frame(col_a = c("bob", NA, "bob", NA, "bob"),
col_b = c(NA, "danny", NA, NA, NA),
col_c = c("paul", NA, NA, "paul", NA))
## col_a col_b col_c
## 1 bob <NA> paul
## 2 <NA> danny <NA>
## 3 bob <NA> <NA>
## 4 <NA> <NA> paul
## 5 bob <NA> <NA>
编写自定义函数的存根
coalesce_plus_1 <- function(data, vars) {
data %>%
mutate(coalesced_col = coalesce(!!! rlang::syms(tidyselect::vars_select(names(.), vars))))
}
coalesce_plus_2 <- function(data, vars) {
data %>%
mutate(coalesced_col = coalesce(!!! rlang::syms(vars)))
}
coalesce_plus_3 <- function(data, vars) {
data %>%
mutate(coalesced_col = coalesce({{ vars }}))
}
结果...
coalesce_plus_1()
df %>%
coalesce_plus_1(data = ., vars = c(col_a, col_b, col_c))
错误:找不到对象“col_a”。
However:
df %>%
coalesce_plus_1(data = ., vars = all_of(starts_with("col")))
## col_a col_b col_c coalesced_col
## 1 <NA> <NA> paul paul
## 2 <NA> danny <NA> danny
## 3 bob <NA> <NA> bob
## 4 <NA> <NA> paul paul
## 5 bob <NA> <NA> bob
coalesce_plus_2()
df %>%
coalesce_plus_2(data = ., vars = c(col_a, col_b, col_c))
lapply(.x, .f, ...) 中的错误:找不到对象“col_a”
And also
df %>%
coalesce_plus_2(data = ., vars = all_of(starts_with("col")))
Error: starts_with()
必须在一个时间内使用选择功能。
我懂了https://tidyselect.r-lib.org/reference/faq-selection-context.html.
Run rlang::last_error()
查看错误发生的位置。
coalesce_plus_3()
df %>%
coalesce_plus_3(data = ., vars = c(col_a, col_b, col_c))
错误:有问题mutate()
input coalesced_col
。 x 输入coalesced_col
无法回收到尺寸 5。 i 输入coalesced_col
is coalesce(c(col_a, col_b, col_c))
。我输入coalesced_col
必须是
尺码 5 或 1,而不是 15。
And also
df %>%
coalesce_plus_3(data = ., vars = all_of(starts_with("col")))
错误:有问题mutate()
input coalesced_col
.
x starts_with()
必须在一个时间内使用选择功能。
我懂了https://tidyselect.r-lib.org/reference/faq-selection-context.html。
我输入coalesced_col
is coalesce(all_of(starts_with("col")))
.
底线
我如何编写自定义函数coalesce()
它将接受数据对象和特定的列名来合并,允许特定的命名,例如,c(col_a, col_b, col_c)
和辅助函数,例如,starts_with("col")
在函数的vars
争论?