我正在尝试开发一个新的对象(用于生物信息学),所以我想从对象的一些元素中提取信息,我想创建一个类似于dplyr的filter的函数。对象有一个数据框架,所以我想从中过滤信息,但问题是data.frame的一些列总是存在,但有些不是,所以我想创建一个函数,使用不总是存在的列提取信息。
类似:
my_function(object, parametersXYZ){
data <- object@gene_table
#generate the filter
result <- filter(data, parametersXYZ)
return(results)
}
在这个意义上,parametersXYZ对应于列,逻辑运算符(==, !=, %in%)和元素要过滤,那么函数将像
一样使用my_function(myobject, genes == “rtxA”)
所以函数将过滤所有rtxA列中的元素. 我在找例子,但我只是没有找到它,所以我试着检查过滤器的代码在dplyr上,但我不知道如何实现它!!
这是data.frame
的一个例子myobject[["gene_table"]] %>% head()
cluster qseqid bp nseqs sample gene VF
1 cluster_00001 IOHEFJOD_02210 15627 20 Sample-001 rtxA rtxA
2 cluster_00001 CJMKIBHP_00364 15621 20 Sample-002 rtxA rtxA
3 cluster_00001 JEJKLKDJ_00421 15621 20 Sample-003 rtxA rtxA
4 cluster_00001 MOOCIOKH_00638 15621 20 Sample-004 rtxA rtxA
5 cluster_00001 HJJCNJPA_01986 15621 20 Sample-005 rtxA rtxA
6 cluster_00001 MDIJOING_00449 15621 20 Sample-006 rtxA rtxA
前4列总是存在,但其余的可以呈现不同的名称,甚至可以有任意数量的列,这些列是我的问题!!
任何手册、建议或想法非常感谢!!
有一种方法可以求值
my_function <- function(object, parametersXYZ){
filter(object@gene_table, {{parametersXYZ}})
}
-不使用object@gene_table
> my_function(iris, Species == "setosa") %>% head
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
在Base R中可以这样做:
my_function <- function(object, parametersXYZ){
par <- substitute(parametersXYZ)
dat <- object@gene_table
subset(dat, eval(par, dat))
}