【问题标题】:Replace all duplicated with na用na替换所有重复的
【发布时间】:2019-06-10 20:23:50
【问题描述】:

我的问题类似于replace duplicate values with NA in time series data using dplyr,但适用于其他时间序列,如下所示:

box_num      date       x         y
6-WQ      2018-11-18   20.2       8
6-WQ      2018-11-25   500.75     7.2
6-WQ      2018-12-2    500.75     23
25-LR     2018-11-18   374.95     4.3
25-LR     2018-11-25   0.134      9.3
25-LR     2018-12-2    0.134      4
73-IU     2018-12-2     225.54    0.7562
73-IU     2018-12-9     28        0.7562
73-IU     2018-12-16    225.54    52.8

library(dplyr)
df %>%
  group_by(box_num) %>%
  mutate_at(vars(x:y), funs(replace(., duplicated(.), NA)))

上面的代码可以识别并替换为 NA,但根本问题是我试图在接下来的步骤中将所有 NA 替换为线性趋势。因为它是一个时间序列。但是当我们看到 box_num :6-WQ20.2 之后,我们可以直接看到一个很大的变化,我们可以说这是一个估算值,所以我会将估算值替换为 NA 和其他情况就像box_num 73-IU 估算值在一周后输入,所以我想用 NA 替换估算值

Expected output :
box_num      date       x         y
6-WQ      2018-11-18   20.2       8
6-WQ      2018-11-25   NA         7.2
6-WQ      2018-12-2    NA         23
25-LR     2018-11-18   374.95     4.3
25-LR     2018-11-25   NA         9.3
25-LR     2018-12-2    NA         4
73-IU     2018-12-2    NA         NA
73-IU     2018-12-9    28         NA
73-IU     2018-12-16   NA         52.8

【问题讨论】:

    标签: r dplyr duplicates time-series na


    【解决方案1】:
    foo = function(x){
        replace(x, ave(x, x, FUN = length) > 1, NA)
    }
    
    myCols = c("x", "y")
    df1[myCols] = lapply(df1[myCols], foo)
    df1
    #  box_num       date      x    y
    #1    6-WQ 2018-11-18  20.20  8.0
    #2    6-WQ 2018-11-25     NA  7.2
    #3    6-WQ  2018-12-2     NA 23.0
    #4   25-LR 2018-11-18 374.95  4.3
    #5   25-LR 2018-11-25     NA  9.3
    #6   25-LR  2018-12-2     NA  4.0
    #7   73-IU  2018-12-2     NA   NA
    #8   73-IU  2018-12-9  28.00   NA
    #9   73-IU 2018-12-16     NA 52.8
    
    #DATA
    df1 = structure(list(box_num = c("6-WQ", "6-WQ", "6-WQ", "25-LR", "25-LR", 
    "25-LR", "73-IU", "73-IU", "73-IU"), date = c("2018-11-18", "2018-11-25", 
    "2018-12-2", "2018-11-18", "2018-11-25", "2018-12-2", "2018-12-2", 
    "2018-12-9", "2018-12-16"), x = c(20.2, 500.75, 500.75, 374.95, 
    0.134, 0.134, 225.54, 28, 225.54), y = c(8, 7.2, 23, 4.3, 9.3, 
    4, 0.7562, 0.7562, 52.8)), class = "data.frame", row.names = c(NA, 
    -9L))
    

    【讨论】:

      【解决方案2】:

      使用tidyverse,您可以:

      df %>%
       group_by(box_num) %>%
       mutate_at(vars(x:y), funs(ifelse(. %in% subset(rle(sort(.))$values, rle(sort(.))$length > 1), NA, .)))
      
        box_num date           x     y
        <fct>   <fct>      <dbl> <dbl>
      1 6-WQ    2018-11-18  20.2  8.00
      2 6-WQ    2018-11-25  NA    7.20
      3 6-WQ    2018-12-2   NA   23.0 
      4 25-LR   2018-11-18 375.   4.30
      5 25-LR   2018-11-25  NA    9.30
      6 25-LR   2018-12-2   NA    4.00
      7 73-IU   2018-12-2   NA   NA   
      8 73-IU   2018-12-9   28.0 NA   
      9 73-IU   2018-12-16  NA   52.8 
      

      首先,它对“x”和“y”中的值进行排序,并计算相等值的运行长度。其次,它为那些游程长度 > 1 的值创建一个子集。最后,它比较“x”和“y”中的值是否在子集中,如果是,则为 NA。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 2021-06-28
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多