在filter()中使用if_any()和starts_with():为什么提供无意义的列名会返回整个数据框?

问题描述 投票:0回答:1

我一直在 R 中的 dplyr::filter() 函数中使用 dplyr::if_any() 。但是,我发现如果我们传递当前数据框中不存在的列名,整个数据框架被返回,这对我来说似乎很奇怪。

示例:

library(dplyr)

nrow(iris) # = 150
iris %>% filter(if_any(starts_with("Sepal"), ~ . > 6)) %>% nrow() # = 61
iris %>% filter(if_any(starts_with("nonsense"), ~ . > 5)) %>% nrow() # = 150
iris %>% filter(if_any(starts_with("nonsense"), ~ . == "more_nonsense")) %>% nrow() # = 150

最后两行只返回整个数据帧,即使没有名称以“nonsense”开头的变量。这对我来说似乎很奇怪;它不应该返回 nrow=0 的数据帧吗?

我猜这种行为有一些根本原因,但即便如此,我想知道我们是否可以在代码中构建一些额外的安全措施,例如告诉我们当前数据框中不存在以“废话”开头的列?

r dplyr
1个回答
0
投票

问题的原因是 if_any() 检查对于任何选定的列,条件是否为真。您没有选择任何列,因此不会执行任何检查。

要检查是否存在任何列,您可以执行以下操作:

v <- "nonsense"

iris %>% 
  {if(any(startsWith(v, colnames(.)))) filter(., if_any(starts_with("Sepal"), ~ . > 6)) else warning("No columns found"); .}
© www.soinside.com 2019 - 2024. All rights reserved.