R 中的子集滞后值

Subset lagged values in R

对于给定的数据 table 请参见下面的示例,我只想通过 Unique_ID 保留大于 2 的值的差异列,而不删除 NA 行。

My_data_table <- structure(list(Unique_ID = structure(c(1L, 1L, 2L, 2L, 3L,
                   3L, 3L, 4L, 4L, 4L), .Label = c("1AA", "3AA", "5AA", "6AA"),
                   class = "factor"), Distance.km. = c(1, 2.05, 2, 4, 2, 4, 7,
                   8, 9, 10), Difference = c(NA, 1.05, NA, 2, NA, 2, 3, NA, 1, 1)),
                   .Names = c("Unique_ID", "Distance.km.", "Difference"),
                   class = "data.frame", row.names = c(NA, -10L))
My_data_table
Unique_ID Distance(km)  Difference    
1AA        1             NA          
1AA        2.05         1.05          
3AA        2             NA          
3AA        4             2          
5AA        2             NA          
5AA        4             2          
5AA        7             3   
6AA        8             NA
6AA        9             1
6AA        10            1

这是我正在寻找的结果

      My_data_table
Unique_ID Distance(km)  Difference            
3AA        2             NA          
3AA        4             2          
5AA        2             NA          
5AA        4             2          
5AA        7             3   

转换为'data.table'后(setDT(df1)),按'Unique_ID'分组,if逻辑向量sum(Difference >= 2)大于 0,然后获取 Data.table (.SD) 的子集,其中 'Difference' 是 NA| 它大于或等于2

library(data.table)
setDT(df1)[,  if(sum(Difference >=2, na.rm = TRUE)>0) 
                .SD[is.na(Difference)|Difference>=2], by = Unique_ID]
#     Unique_ID Distance.km. Difference
#1:       3AA            2         NA
#2:       3AA            4          2
#3:       5AA            2         NA
#4:       5AA            4          2
#5:       5AA            7          3

一个dplyr解决方案:

library(dplyr)

df %>%
  group_by(Unique_ID) %>%
  filter(any(Difference >= 2 & !is.na(Difference)))
# # A tibble: 5 x 3
# # Groups:   Unique_ID [2]
#   Unique_ID Distance.km. Difference
#      <fctr>        <dbl>      <dbl>
# 1       3AA            2         NA
# 2       3AA            4          2
# 3       5AA            2         NA
# 4       5AA            4          2
# 5       5AA            7          3