【问题标题】:R - using a variable to pass column filter conditions to select from data frameR - 使用变量传递列过滤条件以从数据框中进行选择
【发布时间】:2014-04-29 20:18:58
【问题描述】:

我正在尝试使用一个可以包含动态生成的列过滤条件的变量来从数据框中获取子集。 这是情况: 1)数据是一个数据框,列如图所示

   Symbol Yield    PE DivGrowth  
1    ABBV  3.46 18.80      5.00  
2     ABM  2.24 21.18      3.33  
3     ABT  2.26 23.65     10.85  
4     ADM  1.91 22.29      9.08  
5     ADP  2.46 25.83      8.57  
6     AFL  2.25  9.26      5.97  
7     ALB  1.44 13.53     13.15  
8    ANDE  1.02 19.59      5.74  
9     AOS  1.29 25.11      9.99  
10    APD  2.41 25.08      2.53  
11   ARLP  5.50 11.69      1.99  
12   AROW  3.83 14.68      1.01  
13  ARTNA  3.67 23.91      3.20  
14   ATNI  1.68  3.14      7.50  
15    ATO  2.97 18.59      1.72  

2) 我可以在函数调用本身中使用条件进行子集化,例如,

subset(data, PE <= 12 & Yield >=2.98)  

   Symbol Yield    PE DivGrowth  
11   ARLP   5.5 11.69      1.99  

3) 但是,如果我把它作为一个字符放入一个变量中

divSelector<-c("PE <= 12 & Yield >=2.98")  

4) 然后使用该变量进行子集化;我收到如下错误

subset(data, divSelector)  
Error in subset.data.frame(data, divSelector) :   
  'subset' must evaluate to logical  

5)我已经尝试过这个有效的序列,即,

ss<-expression(PE <= 12 & Yield >=2.98)  
subset(data, eval(ss))  

6) 但问题是我无法动态更改“ss”中的条件,例如,我想将PE &lt;= 12 更改为取决于其他内容的内容,例如PE &lt;= threshold,这是在其他地方评估的。

7) 看起来动态过滤条件在从直向量中进行选择时会产生相同的错误!

有什么办法可以做到吗?

【问题讨论】:

  • 问题仍然是我无法在某种向量中设置可变数量的列并将其传递。实际上,有 20 个不同的列,我想使用 6 个或 8 个或其他。所有解决方案都迫使我在函数调用参数中指定列名,我一直在寻找解决方法。

标签: r


【解决方案1】:

如果我正确理解您的问题,您希望动态编辑您的子集。您可能想尝试:

update_set <- function(PE, threshold, data, ...) {
    CONDITIONS <- expression(PE <= threshold)
    data[which(CONDITIONS),] # allows only the TRUE conditions, 
                             # will return your data object
}

通过这种方式,您可以定期调用此函数,在您的上下文(或环境)中传递变量,然后根据您正在寻找的那些要求对您的数据进行子集化。这应该可以帮助您入门。

【讨论】:

  • Thanx - 我还需要包含或排除列 - 我必须提供正确的表达式。
  • 您可以有一个辅助表达式并将其插入列空间,即 [(stuff),(here)]。那时我可能会为这些更复杂的子集例程推荐包 data.table。
【解决方案2】:

怎么样:

target.yield <- 2.98
target.PE <- 12
subset(data, PE <= target.PE & Yield >= target.yield)

【讨论】:

  • 谢谢,这将起作用,但我也希望有可变数量的列可供选择。如果不使用 colX 说,我想可以说 colX >= 0 来选择我猜的所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多