如何select根据R中组内行的顺序进行分组
How to select group based on the order of rows within group in R
例如,我有以下数据框:
ID
variable
order
1
a
1
1
b
2
2
b
1
2
a
2
2
b
3
3
b
1
3
a
2
我只想保留“a”出现在“b”之前的 ID 组(即,a 的“顺序”小于 b)。所以结果看起来像这样:
ID
variable
order
1
a
1
1
b
2
2
b
1
2
a
2
2
b
3
其中仅保留 ID 1 和 2(及其所有原始行),而 ID 3 中的所有行都被删除,因为 b 的“顺序”小于 a。谁能指导如何在 R 中完成此操作?
your_data %>%
group_by(ID) %>%
filter(any(variable == "a" & lead(variable, default = "not b") == "b"))
这将忽略 order
列并基于每个 ID 组中的行顺序。它检查一行上是否存在 "a"
以及紧邻的下一行是否存在 "b"
。
在您的评论中,您说 '"a" 就在“b”之前 - 我同意 “就在”之前 澄清.如果一个组有值 "a", "c", "b"
,它不会保留在我的答案中,因为“a”不是 “就在”“b”之前。
例如,我有以下数据框:
ID | variable | order |
---|---|---|
1 | a | 1 |
1 | b | 2 |
2 | b | 1 |
2 | a | 2 |
2 | b | 3 |
3 | b | 1 |
3 | a | 2 |
我只想保留“a”出现在“b”之前的 ID 组(即,a 的“顺序”小于 b)。所以结果看起来像这样:
ID | variable | order |
---|---|---|
1 | a | 1 |
1 | b | 2 |
2 | b | 1 |
2 | a | 2 |
2 | b | 3 |
其中仅保留 ID 1 和 2(及其所有原始行),而 ID 3 中的所有行都被删除,因为 b 的“顺序”小于 a。谁能指导如何在 R 中完成此操作?
your_data %>%
group_by(ID) %>%
filter(any(variable == "a" & lead(variable, default = "not b") == "b"))
这将忽略 order
列并基于每个 ID 组中的行顺序。它检查一行上是否存在 "a"
以及紧邻的下一行是否存在 "b"
。
在您的评论中,您说 '"a" 就在“b”之前 - 我同意 “就在”之前 澄清.如果一个组有值 "a", "c", "b"
,它不会保留在我的答案中,因为“a”不是 “就在”“b”之前。