簡體   English   中英

基於特定標准對 R 中的序列進行子集化

[英]Subsetting sequences in R based on certain criteria

我想知道是否有一種方法可以對巨大的 R dataframe [df] 進行子集化,以便每個組 [device] 只保留某些序列。

我有一個 dataframe [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

這可能嗎? 謝謝你的任何建議。

當當前值大於 60 且之前的值小於 60 和 select 時,您可以創建一個新組,直到我們遇到第一行小於等於 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

如果你想在沒有dplyr和管道的情況下這樣做,你可以循環遍歷壓力來注釋組:

d$group=NA
d$group[1]=1
for(i in 2:dim(d)[1]){
  if(d$pressure[i]>60 & d$pressure[i-1] < 60){
    d$group[i]=d$group[i-1]+1
  } else if (d$pressure[i]>d$pressure[i-1] & d$pressure[i]<60){
    d$group[i]=d$group[i-1]+1
  } else{
    d$group[i]=d$group[i-1]
  }
}

在這樣的 if-elise if 塊中,您可以根據需要添加任意數量的不同條件(例如更改設備、更改日期...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM