dplyr:如果列存在,则计算表达式,如果不存在,则返回“FALSE”

qzwqbdag  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(105)

我把自己和dplyr和if_any搞混了。我正试着沿着这些路线执行一些事情:
如果列存在,则计算表达式。如果不存在,则返回FALSE
所以这三个场景抓住了我的想法:

library(dplyr)

dat <- data.frame(x = 1)

## GOOD: if foo_col is NA then return FALSE
dat %>%
  mutate(foo_col = NA_character_) %>%
  mutate(present = if_any(matches("foo_col"), ~ !is.na(.x)))
#>   x foo_col present
#> 1 1    <NA>   FALSE

## GOOD: if foo_col is not NA return FALSE
dat %>%
  mutate(foo_col = "value") %>%
  mutate(present = if_any(matches("foo_col"), ~ !is.na(.x)))
#>   x foo_col present
#> 1 1   value    TRUE

## NOT GOOD: if foo_col is absent, return TRUE? Want this to be FALSE.
dat %>%
  mutate(present = if_any(matches("foo_col"), ~ !is.na(.x)))
#>   x present
#> 1 1    TRUE

那么,谁能提出一种方法来确定如何检查is.na条件以及列是否确实存在?

iqjalb3h

iqjalb3h1#

如果我们需要最后一个为FALSE,同时为其他两种情况给出TRUE/FALSE

library(dplyr)
dat %>%
   mutate(present = ncol(pick(matches("foo_col"))) > 0 & 
                   if_any(matches("foo_col"), ~ !is.na(.x)))
  • 输出
x present
1 1   FALSE

或者就像@boshek在评论中提到的,rlang::is_empty应该也能正常工作。

dat %>% 
  mutate(present = !rlang::is_empty((across(matches("foo_col")))) & 
                if_any(matches("foo_col"), ~ !is.na(.x)))
  • 输出
x present
1 1   FALSE

对于其他情况

> dat %>%
+   mutate(foo_col = NA_character_) %>%
+   mutate(present = ncol(pick(matches("foo_col"))) > 0 &if_any(matches("foo_col"), ~ !is.na(.x)))
  x foo_col present
1 1    <NA>   FALSE
> dat %>%
+   mutate(foo_col = "value") %>%
+   mutate(present =  ncol(pick(matches("foo_col"))) > 0 & if_any(matches("foo_col"), ~ !is.na(.x)))
  x foo_col present
1 1   value    TRUE

注:但本测试无法区分FALSENA用例,并且未发现FALSE

相关问题