0

嗨,我正在使用一个大型数据框,我经常需要在不同的变量组合中进行子集化。我希望能够将搜索存储在一个字符串中,这样当我想查看一个子集时就可以引用该字符串。

x = read.table(textConnection("
                              cat1 cat2 value
                              A     Z    1
                              A     Y    2
                              A     X    3
                              B     N    2"),header=T,strip.white=T)
search_string="cat1== 'A' & cat2=='Z'"
with(x,subset(x,search))

不起作用。我要寻找的是类似于下面的搜索结果。

with(x,subset(x,cat1=='A' & cat2=='Z'))

如果存在其他解决方案,我不希望一开始就创建多个子集数据框。

有没有一种简单的方法来做我正在尝试的事情?

4

1 回答 1

3

您需要将字符串转换为表达式,然后评估此表达式

 subset(x, eval(parse(text=search_string)))

  cat1 cat2 value
1    A    Z     1

永远记得

fortune(106)

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)

fortune(181)

Personally I have never regretted trying not to underestimate my own future stupidity.
   -- Greg Snow (explaining why eval(parse(...)) is often suboptimal, answering a question triggered by the
      infamous fortune(106))
      R-help (January 2007)

并注意在这种情况下,进入 eval(parse(text==))) 的输入要多得多

您也可以尝试使用quote来保存call

search <- quote(cat1== 'A' & cat2=='Z')

然后就用

 subset(x, eval(search))

同样重要的是要记住它subset具有非标准评估,因此使用起来可能更安全`[`

x[eval(search,x),]

或者

 x[eval(parse(text=search_string)), x),]
于 2012-12-07T04:51:55.230 回答