首页 > 解决方案 > 在组内发现 +1 值

问题描述

我有一个按 . 分组的大型数据框Date。在每个日期组中,我想保留相邻房间的行,即Room.num=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

我想结束

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

这给了我

Date 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. 但是我无法做我想做的保留房间号为该组中任何其他房间号的 +/- 1Room.numDate
df %>% 
   group_by(Date)
   filter(Room.num==any(Room.num)+1)

我明白了

Date        Room.num  
2 2019.08.21  2  

第二个Room.num总是 = 1

标签: rfilterdplyrgroup-byany

解决方案


我认为你可以做到这一点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()

推荐阅读