data frame
D
is fixed
> D
A1 A2 A3 A4 A5
1 1 1 1 1 1
2 1 1 2 1 3
3 1 2 1 2 2
4 1 1 2 2 2
5 1 2 2 3 2
6 1 2 2 3 2
7 2 2 1 4 1
8 2 2 1 4 1
9 2 3 1 5 1
10 2 3 2 6 1
> D[D$A1==1 & D$A2 == 1 & D$A4 !=1 , c("A2", "A3", "A4")]
A2 A3 A4
4 1 2 2
上面的查询结果是一个数据帧。但是,我不想存储结果数据帧,而是想存储导致上述数据帧的查询。我想以这样一种方式存储查询,以便以后的查询可以很容易地执行。
一种方法是以字符串的形式存储查询。稍后,如果需要执行,我们将首先解析然后执行查询。
存储查询所需的其他操作
- 形式
& D$A5==3
添加条件<<li>添加列/gh><<li>删除列/gh>
假设初始查询为D[D$A1==1 & D$A2 == 1 & D$A4 !=1 , c("A2", "A3", "A4")]
添加D$A5==3
到查询
。D[D$A1==1 & D$A2 == 1 & D$A4 !=1 & D$A5==3 , c("A2", "A3", "A4")
添加列"A5"
。D[D$A1==1 & D$A2 == 1 & D$A4 !=1 & D$A5==3 , c("A2", "A3", "A4", "A5")
删除列"A2"
。D[D$A1==1 & D$A2 == 1 & D$A4 !=1 & D$A5==3 , c("A3", "A4", "A5")
有没有更好更有效的方法?
您可以将其构建为函数调用:
a12.234 <-function(dat, sub = list(NULL), cols= c("A2", "A3", "A4") )
subset(dat,
subset = eval(bquote( A1==1 & A2 == 1 & .( if (
is.null(sub[[1]]) ){TRUE}else{sub} )) ),
select= cols)
> a12.234(D)
A2 A3 A4
1 1 1 1
2 1 2 1
4 1 2 2
> a12.234(D, sub=quote(A5 == 3) )
A2 A3 A4
2 1 2 1
添加列:> a12.234 <-function(dat, sub = list(NULL), add = "")
subset(dat, eval(bquote( A1==1 & A2 == 1 & .( if (
is.null(sub[[1]]) ){TRUE}else{sub} )) ),
select= c("A2", "A3", "A4", if(add==""){NULL}else{add} ))
> a12.234(D, sub=quote(A5 == 3) )
A2 A3 A4
2 1 2 1
> a12.234(D, sub=quote(A5 == 3), add="A1" )
A2 A3 A4 A1
2 1 2 1 1
和最后的请求:从列名的基向量中删除:
a12.234 <-function(dat, sub = list(NULL), add = "", delete=NULL)
subset(dat, eval(bquote( A1==1 & A2 == 1 &
.( if ( is.null(sub[[1]]) ){TRUE}else{
sub} )) ),
select= c("A2", "A3", "A4", if(add==""){NULL}else{add} )[
if(delete != ""){ -which( c("A2", "A3", "A4") %in% delete)}else{
TRUE}] )
> a12.234( D, delete="A2")
A3 A4
1 1 1
2 2 1
4 2 2
您可以使用expression
函数来存储查询(在您可以子集等的类表达式对象中),然后使用eval
函数执行查询:
query <- expression(D[D$A1==1 & D$A2 == 1 & D$A4 !=1 , c("A2", "A3", "A4")])
query
expression(D[D$A1 == 1 & D$A2 == 1 & D$A4 != 1, c("A2", "A3",
"A4")])
eval(query)
A2 A3 A4
4 1 2 2