我想知道是否有一种子集巨大的R数据帧[df]的方法,以便每个组[设备]仅保留某些序列。
我有一个像这样的数据框[df]:
id device date pressure
1 B3 2020-04-15 08:00 112
2 B3 2020-04-15 09:00 100
3 B3 2020-04-15 10:00 89
4 B3 2020-04-15 11:00 90
5 B3 2020-04-15 12:00 60
6 B3 2020-04-15 13:00 28
7 B3 2020-04-16 09:00 120
8 B3 2020-04-16 10:00 80
9 B3 2020-04-16 11:00 73
10 B3 2020-04-16 12:00 61
11 B3 2020-04-16 13:00 30
我只想获取压力从120下降到60 [或第一个值低于60]的行。
预期结果如下:
id device date pressure group
1 B3 2020-04-15 08:00 112 1
2 B3 2020-04-15 09:00 100 1
3 B3 2020-04-15 10:00 89 1
4 B3 2020-04-15 11:00 90 1
5 B3 2020-04-15 12:00 60 1
7 B3 2020-04-16 09:00 120 2
8 B3 2020-04-16 10:00 80 2
9 B3 2020-04-16 11:00 73 2
10 B3 2020-04-16 12:00 61 2
11 B3 2020-04-16 13:00 30 2
这可能吗? 谢谢您的任何建议。
答案 0 :(得分:1)
当当前值大于60并且前一个值小于60时,您可以创建一个新组,并仅选择行,直到遇到小于60的第一行。
library(dplyr)
df %>%
group_by(device,
group = cumsum(pressure > 60 & lag(pressure, default = 0) < 60)) %>%
slice(seq_len(which.max(pressure <= 60)))
# id device date pressure group
# <int> <chr> <chr> <int> <int>
# 1 1 B3 2020-04-1508:00 112 1
# 2 2 B3 2020-04-1509:00 100 1
# 3 3 B3 2020-04-1510:00 89 1
# 4 4 B3 2020-04-1511:00 90 1
# 5 5 B3 2020-04-1512:00 60 1
# 6 7 B3 2020-04-1609:00 120 2
# 7 8 B3 2020-04-1610:00 80 2
# 8 9 B3 2020-04-1611:00 73 2
# 9 10 B3 2020-04-1612:00 61 2
#10 11 B3 2020-04-1613:00 30 2
答案 1 :(得分:0)
如果要在没有class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ('token', 'bio', 'name', 'email', 'sport', 'location', 'image')
和管道的情况下进行操作,则可以遍历压力来注释组:
dplyr
在这种if-elise if块中,您可以根据需要添加任意多个条件(例如,更改设备,更改日期等)