r - 可变过滤条件
问题描述
我知道这个问题很可能是重复的。我试图用谷歌搜索这个问题,但我找不到我要找的东西。
我想做的是根据用户指定的条件过滤数据集。例如:
df <-
data.frame(type = c("a", "a", "b", "b"),
value = c(1,5,7,2), stringsAsFactors = F) %>%
as_tibble()
cond <- ">"
val <- 2
df %>% filter(value, cond, val)
(即与 相同df %>% filter(value>2)
)
如果可能的话,我将能够在函数内部和外部使用此设置。
编辑:
当我问我的问题时,我有点着急。我真正想要的是mutate
根据用户指定的条件,而不是过滤。Ronak Shahs 的回答解决了这个filter
问题,我只是对这个问题做了一些小的改动mutate
。我认为没有必要发布一个新问题,因为这两个问题密切相关。因此,我只是发布了有关该mutate
问题的答案(也回答了 Tjebo 的评论)。
解决方案
另一种方法是使用match.fun
匹配函数来应用并使用 NSE 将其应用于列。
library(dplyr)
library(rlang)
apply_fun <- function(df, col, fun, val) {
fun1 <- match.fun(fun)
df %>% filter(fun1({{col}}, val))
}
df %>% apply_fun(value, cond, val)
# type value
# <chr> <dbl>
#1 a 5
#2 b 7
df %>% apply_fun(value, cond, 1)
# A tibble: 3 x 2
# type value
# <chr> <dbl>
#1 a 5
#2 b 7
#3 b 2
推荐阅读
- python - 更新和更改 PYTHONHOME 变量后发生错误
- data-structures - 有没有一种有效的方法来存储使用随机整数键的查找结构?
- javafx - Javafx MediaException:MEDIA_UNAVAILABLE jar 文件
- python - 将数据框格式化为excel
- python - 有没有办法让一个两位数的整数在列表中被计算时不被拆分?
- gstreamer - GStreamer - fakesink0:sink) (4096 bytes, dts: none, pts: none, duration: none for filesrc 从 srt 文件中读取的第一行文本
- r - 如何在非泊松 lmer 模型中计算过度分散
- c# - 如何在 ASP.NET Core 的 JSON 反序列化过程中将枚举的等价物转换为枚举?
- javascript - 量角器失败:如果我在一个 JS 文件中有 20 多个测试,则脚本超时
- ruby-on-rails - 如果主服务器出现故障,如何设置 mongoid 重试