首页 > 解决方案 > R-通过根据条件删除重复项来创建数据集 - 过滤器

问题描述

我有一个数据框,每天都有几个价格。我想用以下代码修改我的数据框:

newdf <- Data %>%    
 filter(
if (Data$Date == Data$Echeance) {
  Data$Close == lag(Data$Close,1)
} else {
  Data$Close == Data$Close
}
) 

但是,它并没有给我我想要的东西,那就是:创建一个新的数据框,其中变量Close取其正常值,除非日期Date等于Echeance. 在这种情况下,取以下Close值。我添加了过滤器,因为我想删除重复的日期,并且每天只保留一个Close满足上述条件的日期。

没有错误消息,只是没有给我正确的数据库。

这是我的数据的一瞥:

 Date                Echeance            Compens.  Open  Haut   Bas Close 

1 1998-03-27 00:00:00 1998-09-10 00:00:00     125.   828   828   820  820.   197     
2 1998-03-27 00:00:00 1998-11-10 00:00:00     128.   847   847   842  842.   124     
3 1998-03-27 00:00:00 1999-01-11 00:00:00     131.   858   858   858  858.     2     
4 1998-03-30 00:00:00 1998-09-10 00:00:00     125.   821   821   820  820.    38     
5 1998-03-30 00:00:00 1998-11-10 00:00:00     129.   843   843   843  843.     1     
6 1998-03-30 00:00:00 1999-01-11 00:00:00     131.   860   860   860  860.     5     

提前非常感谢。

标签: r

解决方案


听起来像是 , 的用ifelsedplyr

library(dplyr)
Data %>%
    mutate(Close = ifelse(Date==Echeance, lead(Close,1), Close))

这里有一个例子:

dat %>% 
  mutate(var_new = ifelse(date1==date2, lead(var,1), var))

# A tibble: 3 x 4
# date1      date2        var var_new
# <date>     <date>     <int>   <int>
# 1 2018-03-27 2018-03-27    10      11
# 2 2018-03-28 2018-01-01    11      11
# 3 2018-03-29 2018-02-01    12      12

该函数lead将向量移动 1 个位置。另请注意,我创建了一个var_new只是为了显示差异,但您可以直接变异var

使用的数据:

dat <- tibble(date1 = seq(from=as.Date("2018-03-27"), to=as.Date("2018-03-29"), by="day"),
              date2 = c(as.Date("2018-03-27"), as.Date("2018-01-01"), as.Date("2018-02-01")),
              var = 10:12)
dat
# A tibble: 3 x 3
# date1      date2        var
# <date>     <date>     <int>
# 1 2018-03-27 2018-03-27    10
# 2 2018-03-28 2018-01-01    11
# 3 2018-03-29 2018-02-01    12

推荐阅读