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

dplyr中across结合!is.na报错:invalid argument type的原因解析

为什么!is.na在dplyr::across中会触发"invalid argument type"错误?

报错核心原因

  • is.na是一个函数对象,across的第二个参数可以直接接受函数作为输入,所以across(..., is.na)能正常工作——across会把每一列传入is.na函数处理。
  • 但!is.na不是合法的函数引用:R会优先解析!这个逻辑非运算符,尝试对is.na这个函数本身取反。而函数对象不是逻辑值(TRUE/FALSE),所以R会抛出"invalid argument type"错误——因为!只能作用于逻辑类型的对象,不能直接作用于函数。

正确的写法

你可以通过以下几种方式实现"判断是否为有效日期"的需求:

1. 使用公式风格的匿名函数(dplyr推荐写法)

df_test %>% mutate(across(colnames(df_test)[3:5], ~!is.na(.x)))

这里的~表示创建一个公式,.x代表across正在处理的当前列,R会自动把这个公式转换为函数,正确地对每一列执行!is.na()判断。

2. 显式定义匿名函数

df_test %>% mutate(across(colnames(df_test)[3:5], function(x) !is.na(x)))

直接传递一个接受单列参数x、返回!is.na(x)结果的匿名函数。

3. 使用purrr::negate生成取反函数

如果你熟悉purrr包,可以用negate把is.na转换为它的取反函数:

library(purrr)
df_test %>% mutate(across(colnames(df_test)[3:5], negate(is.na)))

正确执行结果

无论用哪种写法,都会得到预期的布尔值列:

# A tibble: 5 × 6
     id applicant_name invited_privately invited interviewed gender
  <int> <chr>          <lgl>             <lgl>   <lgl>       <chr> 
1     1 A              FALSE             FALSE   FALSE        Man   
2     2 B              FALSE             FALSE   FALSE        Woman 
3     3 C              FALSE             FALSE   FALSE        Woman 
4     4 D              TRUE              TRUE    TRUE         Woman 
5     5 E              FALSE             FALSE   FALSE        Man 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:33