如何使用 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
我面临的问题:我遇到的问题是,在我的数据集中,每个 SiteID
的 Seconds
的范围并不像上面的示例那样唯一,但看起来更像以下:
# 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))
我有: 我有一个大型数据集,其中包含一些测量变量、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
我面临的问题:我遇到的问题是,在我的数据集中,每个 SiteID
的 Seconds
的范围并不像上面的示例那样唯一,但看起来更像以下:
# 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))