【问题标题】:dplyr: filter based on another columndplyr:基于另一列过滤
【发布时间】:2016-07-15 12:46:45
【问题描述】:

假设我有以下数据,并且有兴趣按日期获取类型为“ts”的数据。当然,有些日期 ts 不可用,我需要恢复这些日期的“真实”值。

dat = data.frame(dte = c("2011-01-01","2011-02-01","2011-03-01","2011-04-01","2011-05-01",
                         "2011-01-01","2011-02-01","2011-03-01"),
                 type = c("real","real","real","real","real","ts","ts","ts"),
                 value=rnorm(8))
dat

cpy = dat %>% dplyr::filter(type == "ts") 

cpy

如何在 dplyr 中完成类似的操作。

预期输出是:

dte            type    value
"2011-01-01"   ts      ....
"2011-02-01"   ts
"2011-03-01"   ts  
"2011-04-01"   real
"2011-05-01"   real

【问题讨论】:

  • 您的预期输出是什么?您是否有类型为“ts”的 dte 的 NA 值。在这种情况下,请展示一个可重现的示例
  • 但您的预期输出还显示realtype
  • 已添加。并且没有 NA 值,只是缺少不存在的日期值。
  • 是的,如果 ts 可用,请使用它。否则,使用实际值。
  • 我发布了一个解决方案。请检查这是否是您想要的。 “价值”列呢?对于“真实”,它仍然是 NA 吗?

标签: r


【解决方案1】:

你可以试试基础包,

rbind(dat[dat$type == "ts",], dat[!unique(dat$dte) %in% 
                                               dat[dat$type == "ts","dte"], ])

#     dte     type       value
#6 2011-01-01   ts -0.98109206
#7 2011-02-01   ts  1.67626166
#8 2011-03-01   ts -0.06997343
#4 2011-04-01 real  1.27243996
#5 2011-05-01 real -1.63594680

type 等于tsrbind 的行,其余日期来自real 类型。

【讨论】:

    【解决方案2】:

    一个想法可能是group_by() 日期并保留type == "ts" 的值,或者当给定日期没有type == "ts" 时,保留另一个值:

    dat %>%
      group_by(dte) %>%
      filter(type == "ts" | !any(type == "ts"))
    

    这给出了:

    #Source: local data frame [5 x 3]
    #Groups: dte [5]
    #
    #         dte   type      value
    #      <fctr> <fctr>      <dbl>
    #1 2011-04-01   real  0.2522234
    #2 2011-05-01   real -0.8919211
    #3 2011-01-01     ts  0.4356833
    #4 2011-02-01     ts -1.2375384
    #5 2011-03-01     ts -0.2242679
    

    【讨论】:

      【解决方案3】:

      使用dplyr,我们也可以使用which.max

      library(dplyr)
      dat %>%
          group_by(dte) %>%
          slice(which.max(factor(type)))    
      #        dte   type      value
      #      <fctr> <fctr>      <dbl>
      #1 2011-01-01     ts -0.5052456
      #2 2011-02-01     ts -0.4038810
      #3 2011-03-01     ts -1.5349627
      #4 2011-04-01   real  1.6812035
      #5 2011-05-01   real -0.9902754
      

      或者使用与data.table类似的选项

      library(data.table)
      setDT(dat)[, .SD[which.max(factor(type))] , dte]
      #        dte type      value
      #1: 2011-01-01   ts -0.5052456
      #2: 2011-02-01   ts -0.4038810
      #3: 2011-03-01   ts -1.5349627
      #4: 2011-04-01 real  1.6812035
      #5: 2011-05-01 real -0.9902754
      

      【讨论】:

      • 我认为 OP 希望尽可能在给定日期保留值 "ts",如果没有,请保留 "real"。至少这是我从 question 和 cmets 中推断出来的。
      • @StevenBeaupré 谢谢你的评论。我用 data.table 更新了帖子。
      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2018-03-05
      相关资源
      最近更新 更多