如何使用 select() inside between() inside filter() to subset data dplyr r

How to use select() inside between() inside filter() to subset data dplyr r

我有: 我有一个大型数据集,其中包含一些测量变量、SiteID 和 Seconds 的列。

我想做的事情: 对于我的每个研究站点 (SiteID),我想过滤掉特定时间段 ([​​=19=]) 的行。我有以下代码,仅当 Seconds 中的值对于每个研究站点都是唯一的时才有效,例如:

# create example data
data <- data.frame(SiteID = rep(c("A", "B", "C", "D", "E"), each = 10),
                   Seconds = rep(c(1:50)))

# filter the data
data.subset <- data %>%
  filter(between(Seconds, 2, 8) | # for SiteID = "A"
  filter(between(Seconds, 14, 16) | # for SiteID = "B"
  filter(between(Seconds, 23, 30) | # for SiteID = "C"
  filter(between(Seconds, 36, 39) | # for SiteID = "D"
  filter(between(Seconds, 44, 49)) # for SiteID = "E"

上面的代码会给出我想要的,即:

SiteID    Seconds 
A         2
A         3
A         4
A         5
A         6
A         7
A         8
B         14
B         15
B         16
C         23
C         24
C         25
C         26
C         27
C         28
C         29
C         30
D         36
D         37
D         38
D         39
E         44
E         45
E         46
E         47
E         48
E         49

我面临的问题:我遇到的问题是,在我的数据集中,每个 SiteIDSeconds 的范围并不像上面的示例那样唯一,但看起来更像以下:

# create example data
data <- data.frame(SiteID = rep(c("A", "B", "C", "D", "E"), each = 10),
                   Seconds = rep(c(1:10)))

但我想这样对数据进行子集化:对于站点 A,只保留 2-8 秒。对于站点 B,只保留 3-6 秒。对于站点 C,只保留 8-10 秒。对于站点 D,只保留 1-6 秒。 E站只保留2-9秒

我需要帮助修改上面的 dplyr 代码才能执行此操作。如果我使用与上面相同的代码,数据集将保持完全相同并且不会按照我想要的方式进行过滤,因为每个 SiteID 的数字都在相似的范围内。我曾尝试使用 select() 作为 between() 中的第一个术语来过滤掉具有特定 SiteID 的行,但它返回了一个错误:

# modified code 
data.subset <- data %>%
  filter(between(select(data, Seconds & SiteID == "A"), 2, 8) | 
  filter(between(select(data, Seconds & SiteID == "B"), 3, 6) | 
  filter(between(select(data, Seconds & SiteID == "C"), 8, 10) |
  filter(between(select(data, Seconds & SiteID == "D"), 1, 6) | 
  filter(between(select(data, Seconds & SiteID == "E"), 2, 9)) 
#  error message:
Error: Problem with `filter()` input `..1`.
i Input `..1` is `between(...)`.
x Must subset columns with a valid subscript vector.
x Subscript has the wrong type `logical`.
i It must be numeric or character.

基本上,如果我要使用 base R,我需要做类似下面的事情作为 between() 函数中的第一个术语来代替 Seconds:

data$Seconds[data$SiteID == "A"]

我希望大家清楚我要用 dplyr 做什么。我想要的结果是这样的:

SiteID    Seconds  
A         2
A         3
A         4
A         5
A         6
A         7
A         8
B         3
B         4
B         5
B         6
C         8
C         9
C         10
D         1
D         2
D         3
D         4
D         5
D         6
E         2
E         3
E         4
E         5
E         6
E         7
E         8
E         9 

使用&-

组合多个条件
library(dplyr)

data %>%
  filter(SiteID == "A" & between(Seconds, 2, 8) | 
         SiteID == "B" & between(Seconds, 3, 6) | 
         SiteID == "C" & between(Seconds, 8, 10)|
         SiteID == "D" & between(Seconds, 1, 6) | 
         SiteID == "E" & between(Seconds, 2, 9))