[英]Subsetting Dataset in R based on the number of observations that meet criteria. [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.