You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可在dplyr的mutate中复用的自定义函数?

解决方案

原函数无法运行的核心原因是:函数内部没有获取到管道传递的数据源,.在函数上下文里没有对应的数据对象。以下是两种可行的修改方式:

方法一:使用dplyr原生的if_any(推荐)

利用dplyr 1.0.0+提供的if_any函数,专门处理行级多列条件判断,代码更简洁符合tidyverse风格:

library(dplyr)

# 定义函数
anymatch <- function(vars) {
  if_any(all_of(vars), ~ !is.na(.x)) %>% 
    if_else("Yes", "No")
}

# 调用测试
mydata %>%
  mutate(afin = anymatch(avars)) %>%
  count(afin)

方法二:显式传递数据源

让函数接收数据框参数,通过cur_data()在管道中传递当前数据,保留你原本的rowSums思路:

library(dplyr)

# 定义函数
anymatch <- function(.data, vars) {
  rowSums(!is.na(select(.data, all_of(vars)))) >= 1 %>%
    if_else("Yes", "No")
}

# 调用测试
mydata %>%
  mutate(afin = anymatch(cur_data(), avars)) %>%
  count(afin)

注意事项

原测试代码中用了rowSums(...)>1,但注释目标是“捕获a*变量中的任何非缺失值出现情况”,这里应该用>=1(至少一个非NA值),两种修改方案都已按此调整。如果你的实际需求是至少两个非NA值,只需把判断条件改回>1即可。

内容的提问来源于stack exchange,提问作者Moses

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:50:47