我有一个可以任意长的列表。对于此特定示例,它包含三个元素。
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
的调用。
答案 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()