我一直在 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 的数据帧吗?
我猜这种行为有一些根本原因,但即便如此,我想知道我们是否可以在代码中构建一些额外的安全措施,例如告诉我们当前数据框中不存在以“废话”开头的列?
问题的原因是 if_any() 检查对于任何选定的列,条件是否为真。您没有选择任何列,因此不会执行任何检查。
要检查是否存在任何列,您可以执行以下操作:
v <- "nonsense"
iris %>%
{if(any(startsWith(v, colnames(.)))) filter(., if_any(starts_with("Sepal"), ~ . > 6)) else warning("No columns found"); .}