示例数据:
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
对Hour
中uniqueHoursOrder
的每个值都没有行,则表示没有问题。
对于此数据,结果应为:
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
的连续值,即使它没有&#39 ; t为Hour
中的所有值都有uniqueHoursOrder
行。)
dplyr解决方案是理想的,但我会得到任何帮助。
答案 0 :(得分:2)
我们可以通过&#39; ID&#39;,match
分组&#39;小时&#39;使用&uniqueHoursOrder&#39;,获取索引的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))