首页 > 解决方案 > 根据开始日期和值的组合过滤某些 ID 变量

问题描述

structure(list(Stock = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 4L), .Label = c("AAA", "BBB", "CCC", "DDD"), class =     "factor"), 
    Date = structure(c(17632, 17633, 17634, 17632, 17633, 17634, 
    17632, 17633, 17634, 17632, 17633, 17634), class = "Date"), 
    Price = c(5L, 6L, 7L, 10L, 9L, 9L, 6L, 6L, 6L, 10L, 30L, 
    50L), Market.Cap = c(1000L, 1300L, 1600L, 1600L, 1000L, 1000L, 
    600L, 600L, 600L, 400L, 1000L, 2000L)), .Names = c("Stock", 
"Date", "Price", "Market.Cap"), row.names = c(NA, -12L), class =     "data.frame")

我正在尝试根据特定日期的市值过滤此示例。例如,我正在尝试删除股票 BBB,因为它是唯一一个在 2018 年 4 月 11 日市值 > 1500 的股票。但是,如果市值增长超过 1500 点,比如 AAA 和 DDD,股票可以保留在数据框中。我尝试了 dplyr 但无法想出组合来做到这一点。

标签: rdplyr

解决方案


您可以使用分组的filter. 诀窍是要意识到分组过滤器实际上是分组的 mutate 然后是未分组的过滤器。要了解原因,请考虑最后给出相同结果的可比较代码。我们只需要查看每只股票any的行中是否既有特定日期又有过高的市值。

df <- structure(list(Stock = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("AAA", "BBB", "CCC", "DDD"), class = "factor"), Date = structure(c(17632, 17633, 17634, 17632, 17633, 17634, 17632, 17633, 17634, 17632, 17633, 17634), class = "Date"), Price = c(5L, 6L, 7L, 10L, 9L, 9L, 6L, 6L, 6L, 10L, 30L, 50L), Market.Cap = c(1000L, 1300L, 1600L, 1600L, 1000L, 1000L, 600L, 600L, 600L, 400L, 1000L, 2000L)), .Names = c("Stock", "Date", "Price", "Market.Cap"), row.names = c(NA, -12L), class = "data.frame")

library(tidyverse)
df %>%
  group_by(Stock) %>%
  filter(!any(Market.Cap > 1500 & Date == as.Date("2018-04-11")))
#> # A tibble: 9 x 4
#> # Groups:   Stock [3]
#>   Stock Date       Price Market.Cap
#>   <fct> <date>     <int>      <int>
#> 1 AAA   2018-04-11     5       1000
#> 2 AAA   2018-04-12     6       1300
#> 3 AAA   2018-04-13     7       1600
#> 4 CCC   2018-04-11     6        600
#> 5 CCC   2018-04-12     6        600
#> 6 CCC   2018-04-13     6        600
#> 7 DDD   2018-04-11    10        400
#> 8 DDD   2018-04-12    30       1000
#> 9 DDD   2018-04-13    50       2000

df %>%
  group_by(Stock) %>%
  mutate(keep = !any(Market.Cap > 1500 & Date == as.Date("2018-04-11"))) %>%
  filter(keep == TRUE)

reprex 包(v0.2.0)于 2018 年 7 月 20 日创建。


推荐阅读