我正在尝试编写一个将包装的函数,并将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”。
然而:
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'
并且
df %>%
coalesce_plus_2(data = ., vars = all_of(starts_with("col")))
错误:
starts_with()
必须在选择功能内使用。我看到https://tidyselect.r-lib.org/reference/faq-selection-context.html。运行rlang::last_error()
以查看错误发生的位置。
coalesce_plus_3()
df %>%
coalesce_plus_3(data = ., vars = c(col_a, col_b, col_c))
错误:
mutate()
输入问题coalesced_col
。x输入coalesced_col
不能回收为5号。i输入coalesced_col
为coalesce(c(col_a, col_b, col_c))
。i输入的coalesced_col
大小必须为5或1,而不是15。
并且
df %>%
coalesce_plus_3(data = ., vars = all_of(starts_with("col")))
错误:
mutate()
输入问题coalesced_col
。xstarts_with()
必须在选择函数中使用。我看到https://tidyselect.r-lib.org/reference/faq-selection-context.html。我输入coalesced_col
是coalesce(all_of(starts_with("col")))
。
如何为此编写一个自定义函数,coalesce()
以将数据对象和特定的列名合并在一起,从而允许在函数的参数中同时使用特定的命名(例如)c(col_a, col_b, col_c)
和辅助功能(例如)?starts_with("col")
vars
这个简单的实现将只返回选择列,但是可以很容易地扩展为保留所有列(我将bind_cols
它们放回最后...)。
很简单,因为我们依赖于select
为我们做工作,如实施tidyselect小插图开始时所建议的那样
# edited to keep all columns
coalesce_df = function(data, ...) {
data %>%
select(...) %>%
transmute(result = invoke(coalesce, .)) %>%
bind_cols(data, .)
}
df %>%
coalesce_df(everything())
# col_a col_b col_c result
# 1 bob <NA> paul bob
# 2 <NA> danny <NA> danny
# 3 bob <NA> <NA> bob
# 4 <NA> <NA> paul paul
# 5 bob <NA> <NA> bob
df %>% coalesce_df(col_a, col_b)
# col_a col_b col_c result
# 1 bob <NA> paul bob
# 2 <NA> danny <NA> danny
# 3 bob <NA> <NA> bob
# 4 <NA> <NA> paul <NA>
# 5 bob <NA> <NA> bob
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句