【问题标题】:R: pass a list of filtering conditions into a dataframeR:将过滤条件列表传递到数据框中
【发布时间】:2016-07-21 00:39:55
【问题描述】:

我有一个像这样的数据框:

   Symbol Yield    PE    Growth  
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  

还有一长串布尔过滤条件,例如

conditions = c('Symbol in `ABM', 'Growth > 1.2', 'Yield within (2 3)', 'PE>3',....)

有没有办法使用 base R 或 dplyr 我可以做类似的事情

for (condition in conditions) {    
cond = expression(condition)
    dataframe = dataframe[which(cond),]}

以便我可以不断添加到条件列表中,而不是手动粘贴它们并在索引中使用多个 &'s?

输出应该是

filter(dataframe, Symbol in 'ABM' & Growth > 1.2 & Yield within (2 3) & PE>3 &...)

【问题讨论】:

  • 您的预期输出是什么?条件是一个一个评估还是一起评估?
  • 我正在尝试将它们全部一起完成(多个和。)
  • conditions = c('Symbol %in% "ABM"', 'Growth > 1.2', 'Yield %in% c(2,3)', 'PE>3') 可能更接近你想要的。

标签: r dplyr


【解决方案1】:

基础 R 版本:

conditions <- with(dat, list(Symbol %in% "ABM", Growth > 1.2, Yield > 2, Yield < 3, PE > 3))
dat[Reduce(`&`, conditions ),]
#  Symbol Yield    PE Growth
#2    ABM  2.24 21.18   3.33

【讨论】:

  • 我希望有一个 python 类型的 reduce 解决方案!我没有意识到 R 有自己的版本。
  • @michel - 通过?Reduce查看函数式编程帮助页面,了解很多类似的工具,如ReduceMap等。
【解决方案2】:

使用dplyr

library(dplyr)

conditions = c('Symbol %in% "ABM"', 'Growth > 1.2', 'Yield > 2', 'Yield < 3', 'PE > 3')

df %>% filter_(conditions)


  Symbol Yield    PE Growth
1    ABM  2.24 21.18   3.33

数据

structure(list(Symbol = structure(1:15, .Label = c("ABBV", "ABM", 
"ABT", "ADM", "ADP", "AFL", "ALB", "ANDE", "AOS", "APD", "ARLP", 
"AROW", "ARTNA", "ATNI", "ATO"), class = "factor"), Yield = c(3.46, 
2.24, 2.26, 1.91, 2.46, 2.25, 1.44, 1.02, 1.29, 2.41, 5.5, 3.83, 
3.67, 1.68, 2.97), PE = c(18.8, 21.18, 23.65, 22.29, 25.83, 9.26, 
13.53, 19.59, 25.11, 25.08, 11.69, 14.68, 23.91, 3.14, 18.59), 
    Growth = c(5, 3.33, 10.85, 9.08, 8.57, 5.97, 13.15, 5.74, 
    9.99, 2.53, 1.99, 1.01, 3.2, 7.5, 1.72)), .Names = c("Symbol", 
"Yield", "PE", "Growth"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15"))

【讨论】:

  • 现在通过引用 conditions 而不是手动输入来完成。这是棘手的部分。
  • 是的......我认为这解决了它。不知道如何在基础 R 中做到这一点。可能是一些丑陋的eval(parse(...)) 废话,我用起来会很痛苦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2017-03-09
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多