示例数据:
ID <- c('A','A','A','A','A','B','B','B','B','C','C','C','C')
Hour <- c('0','2','5','6','9','0','2','5','6','0','5','6','9')
Intensity <- as.numeric(c('220','192','180','175','140','227','193','163','144','232','205','190','185'))
x <- data.frame(ID, Hour, Intensity)
x
ID Hour Intensity
1 A 0 220
2 A 2 192
3 A 5 180
4 A 6 175
5 A 9 140
6 B 0 227
7 B 2 193
8 B 5 163
9 B 6 144
10 C 0 232
11 C 5 205
12 C 6 190
13 C 9 185
我想删除与 ID
关联的所有行,其中 Hour
的值不是连续的,根据此列表:
uniqueHoursOrder <- sort(unique(Hour))
uniqueHoursOrder
[1] "0" "2" "5" "6" "9"
我想包含任何 ID
,只要它有一行表示 uniqueHoursOrder
的第一个值(即 0),并且其他行按照uniqueHoursOrder
的顺序。如果 ID
没有对应 uniqueHoursOrder
中 Hour
的每个值的行,那也没关系。
对于这个数据,结果应该是:
ID Hour Intensity
1 A 0 220
2 A 2 192
3 A 5 180
4 A 6 175
5 A 9 140
6 B 0 227
7 B 2 193
8 B 5 163
9 B 6 144
(ID
C 被排除,因为它缺少 Hour
2. B 被包括在内,因为它具有从 0 开始的连续 Hour
值,即使尽管对于 uniqueHoursOrder
中的所有值,它没有 Hour
的行。)
dplyr 解决方案是理想的,但我会接受我能得到的任何帮助。
最佳答案
我们可以按'ID'分组,匹配
'Hour'和'uniqueHoursOrder',得到索引的diff
,检查是否all
差值等于 1 并使用该逻辑索引对行进行子集化
library(data.table)
setDT(x)[, .SD[all(diff(match(Hour, uniqueHoursOrder))==1)], ID]
# ID Hour Intensity
#1: A 0 220
#2: A 2 192
#3: A 5 180
#4: A 6 175
#5: A 9 140
#6: B 0 227
#7: B 2 193
#8: B 5 163
#9: B 6 144
同样的方法可以用于 dplyr
library(dplyr)
x %>%
group_by(ID) %>%
filter(all(diff(match(Hour, uniqueHoursOrder))==1))
关于r - 过滤包含列表中连续值的数据组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45511855/