使用dplyr在时间序列数据中用NA替换重复值

Lal*_*tha 5 r time-series duplicates na dplyr

我的数据似乎与其他类似的帖子有所不同。

box_num      date       x        y
1-Q      2018-11-18   20.2      8
1-Q      2018-11-25   21.23     7.2
1-Q      2018-12-2    21.23     23
98-L     2018-11-25   0.134     9.3
98-L     2018-12-2    0.134     4
76-GI    2018-12-2    22.734    4.562
76-GI    2018-12-9    28        4.562
Run Code Online (Sandbox Code Playgroud)

在这里,我想用x和y列中的NA替换重复的值。我尝试使用dplyr的代码:

(1)df <- df %>% group_by(box_num) %>% arrange(box_num,date) %>%
  mutate(df$x[duplicated(df$x),] <- NA)
Run Code Online (Sandbox Code Playgroud)

它创建一个具有所有NA的新列,而不是仅用NA替换重复的值

 (2)df <- df %>% group_by(box_num) %>% arrange(box_num,date) %>%  
distinct(x,.keep_all = TRUE)
Run Code Online (Sandbox Code Playgroud)

第二个只是给出未重复的行(我们缺少时间序列)所需的输出:

box_num      date       x        y
    1-Q      2018-11-18   20.2      8
    1-Q      2018-11-25   21.23     7.2
    1-Q      2018-12-2    NA        23
    98-L     2018-11-25   0.134     9.3
    98-L     2018-12-2    NA        4
    76-GI    2018-12-2    22.734    4.562
    76-GI    2018-12-9    28        NA
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 4

使用dplyr我们可以group_by box_num使用mutate_at xy列并将duplicated值替换为NA

library(dplyr)

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


# box_num date          x     y
#  <fct>   <fct>      <dbl> <dbl>
#1 1-Q     2018-11-18 20.2    8   
#2 1-Q     2018-11-25 21.2    7.2 
#3 1-Q     2018-12-2  NA     23   
#4 98-L    2018-11-25  0.134  9.3 
#5 98-L    2018-12-2  NA      4   
#6 76-GI   2018-12-2  22.7    4.56
#7 76-GI   2018-12-9  28     NA  
Run Code Online (Sandbox Code Playgroud)

基本 R 选项(在这种情况下可能不是最好的)是:

cols <- c("x", "y")
df[cols] <- sapply(df[cols], function(x) 
            ave(x, df$box_num, FUN = function(x) replace(x, duplicated(x), NA)))
Run Code Online (Sandbox Code Playgroud)