以查询的形式存储数据帧



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

上面的查询结果是一个数据帧。但是,我不想存储结果数据帧,而是想存储导致上述数据帧的查询。我想以这样一种方式存储查询,以便以后的查询可以很容易地执行。

一种方法是以字符串的形式存储查询。稍后,如果需要执行,我们将首先解析然后执行查询。

存储查询所需的其他操作

  1. 形式& D$A5==3
  2. 添加条件<<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

最新更新