您好我正在处理一个大型数据框架,我经常需要在不同的变量组合中进行子集化。我希望能够将搜索存储在一个字符串中,这样我就可以在想要查看子集时引用该字符串。
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'))
如果存在其他解决方案,我宁愿不在一开始就创建多个子集化数据帧。
有没有一种简单的方法可以做我正在尝试的事情?
答案 0 :(得分: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(解析(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),]