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
相关产品推荐
相关产品推荐

