如何动态地从列表中选择多个过滤器

时间:2019-07-18 12:59:56

标签: r dplyr purrr

我有一个可以任意长的列表。对于此特定示例,它包含三个元素。

filter_conditions <- list(
  list(col = "mpg", value = 17),
  list(col = "cyl", value = 2),
  list(col = "disp", value = 160)
)

我要在其中创建一个函数my_func,该函数可以应用于数据框,并将过滤器应用于每个filter_conditions元素中指定的相应列。

下面的代码指定了在上述三元素示例中调用my_func(mtcars)所期望的结果。

library(dplyr)

f1 <- function(x) filter(x,  mpg > 17)
f2 <- function(x) filter(x, cyl > 2)
f3 <- function(x) filter(x, disp > 160)

mtcars %>% 
  f1 %>% 
  f2 %>% 
  f3

再次:filter_conditions可以任意长,我不想为filter中的每个元素写下对filter_conditions的调用。

2 个答案:

答案 0 :(得分:4)

1)定义一个函数public class MainActivity extends AppCompatActivity { //This is our tablayout private TabLayout tabLayout; //This is our viewPager private ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tabLayout = findViewById(R.id.tabs); viewPager = findViewById(R.id.view_pager); tabLayout.addTab(tabLayout.newTab().setText("Tab1")); // tabLayout.addTab(tabLayout.newTab().setText("Tab2")); // tabLayout.addTab(tabLayout.newTab().setText("tab3")); Pager adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount()); viewPager.setAdapter(adapter); } ,该函数带有一个数据框和一个表示myfilter的组成部分的列表。然后使用filter_conditions组合它们。不使用任何软件包。

Reduce

给予:

myfilter <- function(data, L) data[data[[L$col]] > L$value, ]
Reduce(myfilter, init = mtcars, filter_conditions)

2)的另一种方法是生成一个SQL mpg cyl disp hp drat wt qsec vs am gear carb Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 子句,然后运行它。

where

如果我们知道值都是数字(如问题示例中的情况),则可以在library(sqldf) where.vec <- sapply(filter_conditions, with, sprintf("%s > '%s'", col, value)) where <- paste(where.vec, collapse = " and ") ix <- fn$sqldf("select rowid from mtcars where $where")$rowid mtcars[ix, ] 的定义中省略单引号。

答案 1 :(得分:2)

您可以使用tidyverse创建一个组合函数:

library(tidyverse)


my_func <- 
  compose(!!!map(filter_conditions,
                 function(f) function(dat) filter(dat, !!sym(f$col) > f$value)))

mtcars %>% 
  my_func()