r - 过滤包含列表中连续值的数据组

标签 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 的顺序。如果 ID 没有对应 uniqueHoursOrderHour 的每个值的行,那也没关系。

对于这个数据,结果应该是:

   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/

相关文章:

根据先前列的覆盖范围重新排列列

r - 如何确定在R中连续两个时间段满足特定条件的组

r - 将 r 包移动到没有互联网的新计算机

r - 我不断收到此错误 “docker: invalid reference format: repository name must be lowercase.”

c# - R 脚本形式 C#。传递参数、运行脚本、检索结果

R : nesting by `ifelse()`

r - ggplot2 和 sf : geom_sf_text within limits set by coord_sf

r - 使用 scale_y_time 在 Boxplot (GGPLOT) 中将 MS 转换为分和秒

r - 用 R 删除反向重复项

r - 使用 mutate() 将列添加到数据框中,作为任意一组其他列的函数