【问题标题】:dplyr's filter function: how to return every value (or «cancel» the effect of filter)?dplyr 过滤器功能:如何返回每个值(或«取消»过滤器的效果)?
【发布时间】:2016-11-21 14:22:21
【问题描述】:

这似乎是一个奇怪的问题,但是有没有办法将一个值传递给 filter() 基本上什么都不做?

data(cars)
library(dplyr)
cars %>% filter(speed==`magic_value_that_returns_cars?`)

你会得到整个数据框cars。我认为这在闪亮的应用程序中可能很有用,用户只需要选择他想要过滤的值;例如,用户可以选择“Europe”、“Africa”或“America”,然后在后台过滤数据框,然后返回包含“Europe”描述性统计信息的表格(如果用户选择“Europe”) .但是,如果用户想要在没有首先过滤的情况下获得描述性统计信息怎么办?是否有一个值可以传递给过滤器以“取消”过滤器并将整个数据帧传递给 summarise()?

【问题讨论】:

  • 简单而正是我想要的!谢谢!
  • 任何计算结果为TRUE 的表达式都可以。另一个例子是cars %>% filter(TRUE)
  • 非常好的解决方案!但是要在使用列名作为参数然后将其传递给filter() 的函数中使用它,我需要一个更通用的表达式,而filter(speed==speed) 似乎更通用。
  • speed == speed 绝对不是一般的。速度 NA 示例:car = data.frame(num = 1:3, speed = c(1:2, NA)); car %>% filter(speed == speed)
  • 谢谢格雷戈里。看来我需要使用ifelse 语句。没什么大不了的!

标签: r dplyr data-manipulation


【解决方案1】:

如果您在闪亮的应用程序中应用此功能,下面是一个示例,说明如何在用户选择“全部”时按“无”进行过滤。大括号和if else 的组合使用将有效地让您跳过将filter 应用于数据集的行:

x <- "All"

cars %>%
  {if(x!="All") filter(.,speed==x) else .} %>%
  head()

# speed dist
# 1     4    2
# 2     4   10
# 3     7    4
# 4     7   22
# 5     8   16
# 6     9   10

# No data is filtered

x <- 7

cars %>%
{if(x!="All") filter(.,speed==x) else .} %>%
  head()

# speed dist
# 1     7    4
# 2     7   22

# The data is filtered by x==7

【讨论】:

    【解决方案2】:

    列总是等于它自己,所以

    cars %>% filter(speed == speed)
    

    将返回完整的数据集。

    更新:事实证明,当数据中有 NA 值时,这将不起作用。对不起,我错过了。因此,为了使这个答案正确,我会敦促您接受 cmets 的 @konvas 推荐。

    cars %>% filter(TRUE)
    

    当然还有其他方法,但我认为这是最好的。

    【讨论】:

    • 如果speed 中有 NA,则此灵魂无效。
    • @GregoryDe​​min 哎呀,你是对的。当我回到我的电脑时,我会在几个小时内更新。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多