根据某些条件对R中的子集序列进行设置

时间:2020-08-21 06:51:55

标签: r dataframe

我想知道是否有一种子集巨大的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

这可能吗? 谢谢您的任何建议。

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块中,您可以根据需要添加任意多个条件(例如,更改设备,更改日期等)