我没有找到 R 中这个常见分组问题的解决方案:
这是我的原始数据集
ID State
1 A
2 A
3 B
4 B
5 B
6 A
7 A
8 A
9 C
10 C
这应该是我分组的结果数据集
State min(ID) max(ID)
A 1 2
B 3 5
A 6 8
C 9 10
因此,我们的想法是首先按 ID 列(或时间戳列)对数据集进行排序。然后,所有没有间隙的连接状态应分组在一起,并返回最小和最大 ID 值。它与 rle 方法相关,但这不允许计算组的最小值、最大值。
有任何想法吗?
你可以尝试:
library(dplyr)
df %>%
mutate(rleid = cumsum(State != lag(State, default = ""))) %>%
group_by(rleid) %>%
summarise(State = first(State), min = min(ID), max = max(ID)) %>%
select(-rleid)
或者正如 @alistaire 在评论中提到的,你实际上可以在内部进行变异group_by()
使用相同的语法,结合前两个步骤。偷窃data.table::rleid()
并使用summarise_all()
简化:
df %>%
group_by(State, rleid = data.table::rleid(State)) %>%
summarise_all(funs(min, max)) %>%
select(-rleid)
这使:
## A tibble: 4 × 3
# State min max
# <fctr> <int> <int>
#1 A 1 2
#2 B 3 5
#3 A 6 8
#4 C 9 10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)