【问题标题】:Logic to validate data and removing noise rows验证数据和去除噪音行的逻辑
【发布时间】:2021-07-26 14:23:31
【问题描述】:

我有一个大约 400 万行的大数据集。 列是

  1. Idx - 狗序列号
  2. 日期 - 事件日期 YYYY-MM-DD(2016 年至 2021 年)
  3. Is_sterilized - 如果狗已绝育,则为 1,如果未绝育,则为 0。

每只狗一年可以出现多次, 它可以出现在 2016 年和 2020 年,但不会出现在 2017-2019 年。

我想计算每年有多少只狗被绝育,这意味着,如果一只狗在一年内从 Is_serilized==0 变为 Is_sterilized ==1,我将其视为当年已绝育,它出现绝育的第一年计为他绝育的一年。

问题是我的数据库不干净,对于一些狗来说,从已消毒变为未消毒,这不可能发生,因为绝育是单程票手术。

狗可能会出现连续 3 年已绝育,然后错误地未绝育 1 年,然后绝育 2 年。

我要问的是,是否有一种逻辑可以让我估计/计算有多少只狗有方向错误。 如果是这样,我如何从我的数据集中推断出这些狗?

在示例数据中,Idx = A 和 C 有意义,但 B 和 D 没有意义

df_test <- data.frame(Idx=c( 'A', 'B', 'B', 'B','A', 'A', 'C',  'C', 'D','D','D','D','D','D','C', 'C','A'  ),
                      YEAR_date=as.Date(c("2016-01-01","2016-01-29","2017-01-01","2016-05-01","2016-05-06","2016-05-01","2016-03-03","2016-04-22","2018-05-05", "2017-02-01"," 2021-11-12"," 2019-09-13"," 2019-11-12"," 2019-08-17", "2011-09-01"," 2011-07-05","2021-01-05")),
                     Is_sterilized =c(0,1,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1)
)

df_test[,c( "Idx" ,"YEAR_date",  "Is_sterilized")]  %>% arrange(Idx ,YEAR_date      )
   Idx  YEAR_date Is_sterilized
1    A 2016-01-01             0
2    A 2016-05-01             1
3    A 2016-05-06             1
4    A 2021-01-05             1
5    B 2016-01-29             1
6    B 2016-05-01             1
7    B 2017-01-01             0
8    C 2011-07-05             1
9    C 2011-09-01             1
10   C 2016-03-03             1
11   C 2016-04-22             1
12   D 2017-02-01             1
13   D 2018-05-05             1
14   D 2019-08-17             1
15   D 2019-09-13             1
16   D 2019-11-12             0
17   D 2021-11-12             0

我有更多的专栏,如果你还有其他相关的东西,请写下来,我会检查一下。

任何提示想法都会有所帮助

提前谢谢你

【问题讨论】:

    标签: r validation dplyr noise-reduction


    【解决方案1】:

    这里有一些 dplyr 代码,用于识别狗的绝育从 1 变为 0 的实例:

    library(dplyr)
    df_test %>%
      group_by(Idx) %>%
      mutate(change = Is_sterilized-lag(Is_sterilized, default = 0)) %>%
      filter(change == -1) %>%
      ungroup()
    
    # A tibble: 3 x 4
      Idx   YEAR_date  Is_sterilized change
      <chr> <date>             <dbl>  <dbl>
    1 B     2017-01-01             0     -1
    2 D     2021-11-12             0     -1
    3 D     2019-11-12             0     -1
    

    如果您想计算该列表中的狗数量,请在末尾添加%&gt;% count(Idx)

    df_test %>%
      group_by(Idx) %>%
      mutate(change = Is_sterilized-lag(Is_sterilized, default = 0)) %>%
      filter(change == -1) %>%
      ungroup() %>%
      count(Idx, name = "times_desterilized")
    
    # A tibble: 2 x 2
      Idx   times_desterilized
      <chr>              <int>
    1 B                      1
    2 D                      2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-31
      • 2015-07-10
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2019-07-30
      相关资源
      最近更新 更多