在一组中查找值 +1

Finding value +1 within a group

我有一个按 Date 分组的大型数据框。在每个日期组中,我想保留相邻房间的行,即 Room.num = any Room.num in group +/- 1

 Date        Room.num  
1 2019.08.21  1  
2 2019.08.21  2  
3 2020.07.18  6  
4 2020.07.18  1  
5 2020.07.18  3

我只想结束

  Date        Room.num  
1 2019.08.21  1  
2 2019.08.21  2 
  1. 我试过了
df %>% 
   group_by(Date)
   filter(Room.num=1)

这给了我

日期Room.num
1 2019.08.21 1
4 2020.07.18 1

  1. 我也试过了
df %>% 
   group_by(Date)
   filter(any(Room.num=1))

这给了我

  Date        Room.num  
1 2019.08.21  1  
2 2019.08.21  2  
3 2020.07.18  6  
4 2020.07.18  1  
5 2020.07.18  3

即任何具有 Room.num=1

的组
  1. 但我无法做我想做的事情,保留房间号为该 Date
  2. 中任何其他 Room.num +/- 1 的行
df %>% 
   group_by(Date)
   filter(Room.num==any(Room.num)+1)

我明白了

Date        Room.num  
2 2019.08.21  2  

第二个Room.num总是=1

我想你可以在 tidyverse

df <- read.table(header = T, text = 'Date Room.num
1 2019.08.21 1
2 2019.08.21 2
3 2020.07.18 6
4 2020.07.18 1
5 2020.07.18 3
')

library(tidyverse)
df  %>%
  group_by(Date) %>%
  filter(map_lgl(Room.num, ~ .x %in% c(Room.num -1, Room.num +1))) %>%
  ungroup()
#> # A tibble: 2 x 2
#>   Date       Room.num
#>   <chr>         <int>
#> 1 2019.08.21        1
#> 2 2019.08.21        2

但是,如果您想避免 purrr::map_lgl 使用类似的 baseR 函数,就像这样

df  %>%
  group_by(Date) %>%
  filter(unlist(Map(\(.x) .x %in% c(Room.num -1, Room.num +1), Room.num))) %>%
  ungroup()

试试这个解决方案:

#Just creating your dataset
df <- data.frame(Date = c(as.Date('2019-08-21'), as.Date('2019-08-21'),
                          as.Date('2020-07-18'), as.Date('2020-07-18'),
                          as.Date('2020-07-18')),
                 Room.num = c(1,2,6,1,3))

df %>% 
  group_by(Date) %>%
  filter(any(abs(diff(Room.num)) == 1))