过滤包含列表

时间:2017-08-04 16:45:41

标签: r

示例数据:

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。如果IDHouruniqueHoursOrder的每个值都没有行,则表示没有问题。

对于此数据,结果应为:

   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解决方案是理想的,但我会得到任何帮助。

1 个答案:

答案 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))