首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Filter if_any everything行为

Filter if_any everything行为
EN

Stack Overflow用户
提问于 2021-04-28 20:05:52
回答 1查看 140关注 0票数 0

早上好!

在dplyr中遇到了filter(if_any(everything()))调用的一些奇怪的行为。

代码语言:javascript
复制
# 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似乎会产生预期的结果。

代码语言:javascript
复制
# Also expected results --------------------
iris %>% 
  tibble() %>% 
  mutate(Species = as.character(Species)) %>% 
  filter(if_any(everything(), 
                ~ .x < 2))

无论如何,期待您的回复。我真的很喜欢过滤时的if_any()if_all()实现,并且真的希望这些功能能够成功。

感谢您在这个问题上的时间和考虑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 20:09:02

这是因为:

代码语言:javascript
复制
as.character(unique(iris$Species)) > 60
#[1] TRUE TRUE TRUE

鉴于:

代码语言:javascript
复制
as.character(unique(iris$Species)) < 2
#[1] FALSE FALSE FALSE

在这里,当我们比较数字和字符串时,它也将60和2强制为字符串,然后将其与Species进行比较。使用where(is.numeric)是正确的方法,因为将数字与字符串进行比较是没有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67299931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档