【问题标题】:filter based on conditional criteria in r根据 r 中的条件标准进行过滤
【发布时间】:2016-11-13 21:28:09
【问题描述】:

我的 R 环境中有一个数据框,我想根据特定条件对其进行子集化 - 一种条件过滤器。我的数据框是 2004-2014 年间每一天的每日值的面板数据集。数据框中的每一天都是一个单独的观察值。一年有366天。我想对数据进行子集化,以便仅闰年保留面板数据中的第 366 天。该时间范围内有三个闰年 -2004、2008、2012。我有一个单独的列用于年份和年份。换句话说,我需要一个脚本来返回一个没有第 366 天的数据集,但只针对 2004 年、2008 年和 2012 年以外的每一年。

我已经设法通过以下方式完成此操作:我将我的日期和年份列粘贴在一起(例如“2006-366”)并简单地使用 dplyr 的过滤器命令来设置每年的子集(2005-366、2006-366、2007 -366、2009-366、2010-366、2011-366、2013-366、2014-366)。然而,这是一种非常粗糙的方法。我希望有人可以在这里为我指明正确的方向。这是一些可重现的数据以及我使用的工作流程。

 #Create DF
 year<-rep(c(2004:2014), each=366)
 day<-rep(c(1:366))
 df<-data.frame(day, year)

 #My crude method
 df $reduc<-paste(df$year, df$day, sep="-")

 df <-df %>%
    filter(reduc!="2005-366") %>%
    filter(reduc!="2006-366") %>%
    filter(reduc!="2007-366") %>%
    filter(reduc!="2009-366") %>%
    filter(reduc!="2010-366") %>%
    filter(reduc!="2011-366") %>%
    filter(reduc!="2013-366") %>%
    filter(reduc!="2014-366") 

【问题讨论】:

    标签: r filter subset


    【解决方案1】:

    设置数据:

    df  <- expand.grid(year=2004:2014,day=1:366)
    nrow(df) ## 4026
    

    现在排除(年份不能被 4 整除)和(天等于 366)的情况(如果您在数据集中包含 2000 年和/或世纪年,则识别非闰年会更加棘手......)

    library(dplyr)
    df2 <- df %>% filter(!(year %% 4 > 0 & day==366))
    

    【讨论】:

      【解决方案2】:

      您应该为您的日期派生正确的Date 值。这可以通过为每一行的 year 构建 1 月 1 日字符串表示,强制转换为 Date 类型,然后将 day(减 1)添加到 Date 值来完成。

      df$date <- as.Date(paste0(df$year,'-01-01'))+(df$day-1L);
      

      然后,我们将能够从 Date 值中提取年份,并根据输入 year 进行检查。如果它们不匹配,那么我们知道year/day 组合无效,我们可以从数据中删除它。这是可行的,因为在上述推导方法下,无效的闰日将转换为下一年的 1 月 1 日。

      df[df$year==as.integer(strftime(df$date,'%Y')),];
      ##      day year       date
      ## 1      1 2004 2004-01-01
      ## ...
      ## 366  366 2004 2004-12-31
      ## 367    1 2005 2005-01-01
      ## ...
      ## 731  365 2005 2005-12-31
      ## 733    1 2006 2006-01-01
      ## ...
      ## 1097 365 2006 2006-12-31
      ## 1099   1 2007 2007-01-01
      ## ...
      ## 1463 365 2007 2007-12-31
      ## 1465   1 2008 2008-01-01
      ## ...
      ## 1830 366 2008 2008-12-31
      ## 1831   1 2009 2009-01-01
      ## ...
      ## 2195 365 2009 2009-12-31
      ## 2197   1 2010 2010-01-01
      ## ...
      ## 2561 365 2010 2010-12-31
      ## 2563   1 2011 2011-01-01
      ## ...
      ## 2927 365 2011 2011-12-31
      ## 2929   1 2012 2012-01-01
      ## ...
      ## 3294 366 2012 2012-12-31
      ## 3295   1 2013 2013-01-01
      ## ...
      ## 3659 365 2013 2013-12-31
      ## 3661   1 2014 2014-01-01
      ## ...
      ## 4025 365 2014 2014-12-31
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-08
        • 2021-06-25
        • 2013-09-06
        • 2022-09-29
        • 1970-01-01
        • 2018-07-10
        • 2020-05-25
        • 2022-08-08
        相关资源
        最近更新 更多