【问题标题】:delete observations by days in R在 R 中按天删除观察
【发布时间】:2018-06-15 17:11:17
【问题描述】:

我的数据集具有下一个结构

    df=structure(list(Data = structure(c(12L, 13L, 14L, 15L, 16L, 17L, 
18L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L), .Label = c("01.01.2018", 
"02.01.2018", "03.01.2018", "04.01.2018", "05.01.2018", "06.01.2018", 
"07.01.2018", "12.02.2018", "13.02.2018", "14.02.2018", "15.02.2018", 
"25.12.2017", "26.12.2017", "27.12.2017", "28.12.2017", "29.12.2017", 
"30.12.2017", "31.12.2017"), class = "factor"), sku = 1:18, metric = c(100L, 
210L, 320L, 430L, 540L, 650L, 760L, 870L, 980L, 1090L, 1200L, 
1310L, 1420L, 1530L, 1640L, 1750L, 1860L, 1970L), action = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L)), .Names = c("Data", "sku", "metric", "action"), class = "data.frame", row.names = c(NA, 
-18L))

我需要删除具有特定日期的观察。 但是在这个数据集中有动作变量。 action 列只有两个值 0 和 1。 仅针对零类行动应删除对这些特定日期的观察。 这些日期显示在单独的数据集中。

    datedata=structure(list(Data = structure(c(18L, 19L, 20L, 21L, 22L, 5L, 
7L, 9L, 11L, 13L, 15L, 17L, 23L, 1L, 2L, 3L, 4L, 6L, 8L, 10L, 
12L, 14L, 16L), .Label = c("01.05.2018", "02.05.2018", "03.05.2018", 
"04.05.2018", "05.03.2018", "05.05.2018", "06.03.2018", "06.05.2018", 
"07.03.2018", "07.05.2018", "08.03.2018", "08.05.2018", "09.03.2018", 
"09.05.2018", "10.03.2018", "10.05.2018", "11.03.2018", "21.02.2018", 
"22.02.2018", "23.02.2018", "24.02.2018", "25.02.2018", "30.04.2018"
), class = "factor")), .Names = "Data", class = "data.frame", row.names = c(NA, 
-23L))

我该怎么做?

【问题讨论】:

  • 您的第一个 data.frame (df) 没有任何日期列。即使没有action这样的列。
  • @MKR 我编辑了帖子,请检查
  • 似乎没有什么要过滤的。你能重新检查你的数据吗? df 中唯一来自 2018 的日期是 01-01-2018action=0datedata 中没有相同的日期。因此,不会删除任何内容。

标签: r dplyr plyr lapply lubridate


【解决方案1】:

一种解决方案是使用dplyr::filter 作为:

library(dplyr)
library(lubridate)

df %>% mutate(Data = dmy(Data)) %>%
  filter(action==1 | (action==0 & !(Data %in% dmy(datedata$Data))))

#          Data sku metric action
# 1  2017-12-25   1    100      0
# 2  2017-12-26   2    210      0
# 3  2017-12-27   3    320      0
# 4  2017-12-28   4    430      0
# 5  2017-12-29   5    540      0
# 6  2017-12-30   6    650      0
# 7  2017-12-31   7    760      0
# 8  2018-01-01   8    870      0
# 9  2018-01-02   9    980      1
# 10 2018-01-03  10   1090      1
# 11 2018-01-04  11   1200      1
# 12 2018-01-05  12   1310      1
# 13 2018-01-06  13   1420      1
# 14 2018-01-07  14   1530      1
# 15 2018-02-12  15   1640      1
# 16 2018-02-13  16   1750      1
# 17 2018-02-14  17   1860      1
# 18 2018-02-15  18   1970      1

【讨论】:

    【解决方案2】:

    我想这会奏效。先用match查看天气df当天和datedata当天有匹配,然后过滤

    library (dplyr)
    
    df <- df %>% mutate (Data.flag = match(Data,datedata$Data)) %>%
        filter(!is.na(Data.flag) & action == 0)
    

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-31
      相关资源
      最近更新 更多