早上好!
在dplyr中遇到了filter(if_any(everything()))调用的一些奇怪的行为。
# Reprex
library(tidyverse)
## Does not work as expected -----------
iris %>%
tibble() %>%
mutate(Species = as.character(Species)) %>%
filter(if_any(everything(),
~ .x > 60))
## Works as expected ------------------
iris %>%
tibble() %>%
mutate(Species = as.character(Species)) %>%
filter(if_any(where(is.numeric),
~ .x > 60))我期望从两者得到的结果都是0 x 0的tibble。但是,当其中一个列类型是字符时,当按所有内容进行过滤时,返回的tibble似乎就是整个数据帧。有人能解释一下为什么结果不一样吗?
这种行为特别奇怪,因为稍微将函数修改为.x < 2似乎会产生预期的结果。
# Also expected results --------------------
iris %>%
tibble() %>%
mutate(Species = as.character(Species)) %>%
filter(if_any(everything(),
~ .x < 2))无论如何,期待您的回复。我真的很喜欢过滤时的if_any()和if_all()实现,并且真的希望这些功能能够成功。
感谢您在这个问题上的时间和考虑。
发布于 2021-04-28 20:09:02
这是因为:
as.character(unique(iris$Species)) > 60
#[1] TRUE TRUE TRUE鉴于:
as.character(unique(iris$Species)) < 2
#[1] FALSE FALSE FALSE在这里,当我们比较数字和字符串时,它也将60和2强制为字符串,然后将其与Species进行比较。使用where(is.numeric)是正确的方法,因为将数字与字符串进行比较是没有意义的。
https://stackoverflow.com/questions/67299931
复制相似问题