如何创建可在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
相关产品推荐
相关产品推荐

