【问题标题】:Removing rows containing specific dates in R在 R 中删除包含特定日期的行
【发布时间】:2015-01-19 23:15:57
【问题描述】:

免责声明:我要摆脱这种看起来很傻的状态。

我有一个数据框,其中包含一个日期为 POSIXct 类的列。我正在尝试删除一些包含特定日期的行——公共假期。我试着用这个来做到这一点:

> modelset.nonholiday <- modelset[!modelset$date == as.POSIXct("2013-12-31")| !modelset$date ==as.POSIXct("2013-07-04") | !modelset$date == as.POSIXct("2014-07-04")| !modelset$date == as.POSIXct ("2013-11-28") | !modelset$date == as.POSIXct ("2013-11-29") | !modelset$date == as.POSIXct ("2013-12-24") | !modelset$date == as.POSIXct ("2013-12-25") | !modelset$date == as.POSIXct ("2014-02-14") | !modelset$date == as.POSIXct ("2014-04-20") | !modelset$date == as.POSIXct ("2014-05-26"), ]

上述方法无效。它返回仅删除第一个的数据框所以我尝试了:

modelset[!modelset$date %in% c("2013-12-31", "2013-07-04", "2014-07-04",
             "2013-11-28", "2013-11-29", "2013-12-24", "2013-12-25", "2014-02-14", 
             "2014-04-20", "2014-05-26"), ]

这也不起作用。我也试过:

`%notin%` <- function(x,y) !(x %in% y) 

modelset[modelset$date %notin% as.POSIXct(c("2013-12-31", "2013-07-04", "2014-07-04",
                 "2013-11-28", "2013-11-29", "2013-12-24", "2013-12-25", "2014-02-14",
                 "2014-04-20", "2014-05-26")), ]`

我已经推荐了Remove Rows From Data Frame where a Row match a StringR remove rows containing a certain valueStandard way to remove multiple elements from a dataframe,但似乎找不到我做错了什么。

> head(modelset)
    date spot.volume.loc spot.volume.nat nat.imp.a loc.imp.a nat.imp.m loc.imp.m branded.leads esi.leads
1 2013-07-01            2988             215     13931    4155.3      5770    1853.7           331       363
2 2013-07-02            3200             218     12589    4651.3      5374    2207.8           293       428
3 2013-07-03            3066             203     10305    3921.0      4754    1759.2           273       325
4 2013-07-04            3153              83      2353    4135.6       999    1912.2           172       184
5 2013-07-05            2959              59      1553    3573.4       815    1662.3           193       246
6 2013-07-06             667              53      2219     456.7       889     214.8           161       203
tv.leads callin.leads total.leads total.imp.a total.imp.m       day week quarter on.off
1      195           41         930     18086.3      7623.7    Monday   26      Q3   1.25
2      192           50         963     17240.3      7581.8   Tuesday   26      Q3   1.00
3      149           38         785     14226.0      6513.2 Wednesday   26      Q3   1.00
4       34            0         390      6488.6      2911.2  Thursday   26      Q3   1.00
5       50           18         507      5126.4      2477.3    Friday   26      Q3   0.75
6       14            9         387      2675.7      1103.8  Saturday   26      Q3   0.50

【问题讨论】:

  • 你可以试试modelset[!as.Date(modelset$date) %in% as.Date(c("2013-12-31", "2013-07-04", "2014-07-04","2013-11-28", "2013-11-29", "2013-12-24", "2013-12-25", "2014-02-14", "2014-04-20", "2014-05-26")), ](所以你要确保model$date和日期向量的格式相同)
  • 不可思议但仍然无法正常工作!返回完全相同的data.frame
  • 然后考虑显示一小部分 data.frame,以便其他人可以重现该问题。
  • 对不起,它正在工作。我少了一个逗号。问题在于正确识别的模型$日期和日期向量的差异。谢谢!
  • 不知道为什么这个问题被否决了。 .问题在于日期向量和列值的格式不同。我不知道这个概念,现在已经学会了。

标签: r dataframe subset posixct


【解决方案1】:

对于使用dplyr 和使用%notin% 方法的答案,您还有:

library(dplyr)

dates <- 
  as.POSIXct(c("2013-12-31", "2013-07-04", "2014-07-04", "2013-11-28", "2013-11-29", 
               "2013-12-24", "2013-12-25", "2014-02-14", "2014-04-20", "2014-05-26"))

`%notin%` <- function(x,y) !(x %in% y) 

modelset %>%
  filter(date %notin% dates)

【讨论】:

    【解决方案2】:

    像这样使用 which 语句:

    dat <- as.POSIXct(c("2013-12-31", "2013-07-04", "2014-07-04",
                                             "2013-11-28", "2013-11-29", "2013-12-24", "2013-12-25", "2014-02-14", 
                                             "2014-04-20", "2014-05-26"))
    
    dat[which(dat != as.POSIXct(c("2013-12-31", "2014-07-04")))]
    

    在你的情况下,我相信它会是:

    modelset <- modelset[which(!modelset$date %in% c("2013-12-31", "2013-07-04", "2014-07-04",
             "2013-11-28", "2013-11-29", "2013-12-24", "2013-12-25", "2014-02-14", 
             "2014-04-20", "2014-05-26"))]
    

    which 语句的作用是返回被评估为真的行号。然后将它放在括号内,它将这些行号指定为唯一要显示的行号。

    【讨论】:

    • 也可以通过逻辑对 data.frame 进行子集化,因此 which 是可能的,但不是必需的。
    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 2018-01-31
    • 2019-04-25
    • 2018-06-20
    相关资源
    最近更新 更多