gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:19:51 24 4
gpt4 key购买 nike

示例数据:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com