Заменить все дублированные на na - PullRequest
0 голосов
/ 16 января 2019

Мой вопрос похож на заменить дублирующиеся значения на NA в данных временных рядов, используя 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-WQ после 20.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

Ответы [ 2 ]

0 голосов
/ 16 января 2019

С 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 

Во-первых, он сортирует значения по «х» и «у» и вычисляет длину пробега равных значений. Во-вторых, он создает подмножество для тех значений, у которых длина прогона> 1. Наконец, он сравнивает, находятся ли значения в «x» и «y» в подмножестве, и если да, то они получают NA.

0 голосов
/ 16 января 2019
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))
...