Лично мне интересно, стоит ли использовать именованный вектор для подмножества фрейма данных, поскольку он может использоваться только для равенства =
, а larger than
и smaller than
не могут быть выражены таким образом. Я бы рекомендовал использовать выражение в кавычках вместо именованного вектора (см. Подход ниже).
Однако я нашел способ tidyverse
написать функцию с указанной функциональностью:
library(tidyverse)
set.seed(123)
n <- 10
ds.df <- data.frame(col1 = round(rnorm(n,2,4), digit=1),
col2 = sample.int(2, n, replace=T),
col3 = sample.int(n*10, n),
col4 = sample(letters, n, replace=T))
new_filter <- function (data, expr) {
exprs_ls <- purrr::imap(expr, ~ rlang::exprs(!! rlang::sym(.y) == !!.x))
filter(data, !!! unname(unlist(exprs_ls)))
}
new_filter(ds.df, c(col1 = -0.2, col4 = "i"))
#> col1 col2 col3 col4
#> 1 -0.2 1 9 i
Создано 17.06.2020 пакетом репекс (v0.3.0)
Ниже мой альтернативный подход . В base R вы можете использовать quote
для цитирования выражения подмножества (вместо создания вектора), а затем вы можете использовать eval для его вычисления внутри subset
.
n <- 10
ds.df=data.frame(col1=round(rnorm(n,2,4),digit=1),
col2=sample.int(2,n,replace=T),
col3=sample.int(n*10,n),
col4=sample(letters,n,replace=T))
subset_v = quote(col1 > 2 & col3 > 40)
subset(ds.df, eval(subset_v))
#> col1 col2 col3 col4
#> 1 6.6 1 93 m
#> 2 7.0 2 62 j
#> 4 3.9 1 94 t
#> 7 4.5 1 46 r
#> 8 2.8 2 98 h
#> 10 4.9 1 78 p
Создано 17.06.2020 с помощью пакета REPEX (v0.3.0)
Тот же подход, но с использованием dplyr filter
library(dplyr)
n <- 10
ds.df = data.frame(col1 = round(rnorm(n,2,4), digit=1),
col2 = sample.int(2, n, replace=T),
col3 = sample.int(n*10, n),
col4 = sample(letters, n, replace=T))
filter_v = expr(col1 > 2 & col3 > 40)
filter(ds.df, !! filter_v)
#> col1 col2 col3 col4
#> 1 3.3 1 70 a
#> 2 2.5 2 82 q
#> 3 3.6 1 51 z
Создано 17.06.2020 пакетом REPEX (v0.3.0)