首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >dplyr:基于另一列进行过滤

dplyr:基于另一列进行过滤
EN

Stack Overflow用户
提问于 2016-07-15 20:46:45
回答 3查看 3.4K关注 0票数 0

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

代码语言:javascript
复制
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中完成呢。

预期输出为:

代码语言:javascript
复制
dte            type    value
"2011-01-01"   ts      ....
"2011-02-01"   ts
"2011-03-01"   ts  
"2011-04-01"   real
"2011-05-01"   real
EN

回答 3

Stack Overflow用户

发布于 2016-07-15 21:10:40

您可以尝试使用基础包,

代码语言:javascript
复制
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等于ts的行,并从real类型中提取剩余日期的rbind

票数 3
EN

Stack Overflow用户

发布于 2016-07-15 21:32:22

一种想法是group_by() date,并将值保留在type == "ts"的位置,或者当给定日期没有type == "ts"时,保留另一个值:

代码语言:javascript
复制
dat %>%
  group_by(dte) %>%
  filter(type == "ts" | !any(type == "ts"))

这就给出了:

代码语言:javascript
复制
#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
票数 2
EN

Stack Overflow用户

发布于 2016-07-15 20:53:30

通过使用dplyr,我们还可以使用which.max

代码语言:javascript
复制
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使用类似的选项

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38396516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档