我正在我的資料集中尋找最后 6 個樣本中的 4 個顯示濃度逐漸增加的實體。我已經制定了一系列 if 陳述句的邏輯,但我無法將其應用于我的資料。我計劃使用 cbind 將串列附加到我的資料集,但串列最終有 28 個值,而我的資料只有 24 行。
我無法弄清楚 for 回圈發生了什么,并且讀到它不是做事的好方法,所以我正在尋找替代方案。
編輯:我添加了一些建議答案失敗的特定示例的照片。問題似乎在于“簡單”解決方案僅在連續點之間尋找增加。我正在尋找每組增加的六分中的四分。

原答案:
我認為我們可以通過計算累積增加的數量來做到這一點,然后查看在 6 個值的視窗中增加是如何變化的。
library(dplyr)
GWSubsetData %>%
mutate(increases = cumsum(REPORT_RESULT_VALUE > lag(REPORT_RESULT_VALUE, default = 0)),
n_incr_last_6 = increases - lag(increases, 6, default = 0),
flag = n_incr_last_6 >= 4)
SAMPLE_DATE REPORT_RESULT_VALUE increases n_incr_last_6 flag
1 2013-08-02 0.1470 1 1 FALSE
2 2014-06-13 0.0623 1 1 FALSE
3 2015-09-03 1.4600 2 2 FALSE
4 2016-06-12 0.1810 2 2 FALSE
5 2016-09-27 0.0509 2 2 FALSE
6 2017-05-30 0.0801 3 3 FALSE
7 2017-05-30 0.0801 3 2 FALSE
8 2017-09-14 0.0999 4 3 FALSE
9 2017-09-14 0.0980 4 2 FALSE
10 2017-12-02 0.0820 4 2 FALSE
11 2018-03-29 0.0698 4 2 FALSE
12 2018-06-05 0.0884 5 2 FALSE
13 2018-10-19 0.1060 6 3 FALSE
14 2019-02-27 0.1010 6 2 FALSE
15 2019-06-04 0.0984 6 2 FALSE
16 2019-08-28 0.1050 7 3 FALSE
17 2019-10-22 0.1100 8 4 TRUE
18 2020-02-04 0.0980 8 3 FALSE
19 2020-06-06 0.1000 9 3 FALSE
20 2020-08-26 0.1090 10 4 TRUE
21 2020-10-23 0.1050 10 4 TRUE
22 2021-02-01 0.0662 10 3 FALSE
23 2021-06-15 0.0944 11 3 FALSE
24 2021-08-03 0.1220 12 4 TRUE
基本 R 等效項:
GWSubsetData$incr = cumsum(c(1, diff(GWSubsetData$REPORT_RESULT_VALUE) > 0))
GWSubsetData$flag = (GWSubsetData$incr - lag(GWSubsetData$incr, 6, default = 0)) >= 4
uj5u.com熱心網友回復:
編輯:
我承認這種方法不會導致您的預期結果,但我想發布它以防它刺激您/其他人想出替代方法來蠻力強制(如果有的話......)。在這里,我根據日期和 val 之間的線性關系的斜率方向來定義“漸進式增加”:
dat$date2 <- as.numeric(as.Date(dat$date, "%Y-%m-%d"))
w <- 6 # window
## With a loop
dat$slope <- NA
for(i in w:nrow(dat)){
dat[i,"slope"] <- coef(lm(val ~ date2, data = dat[(i-w):i,]))[2]
}
## Without a loop
dat$slope2 <- NA
dat[w:nrow(dat), "slope2"] <- sapply(w:nrow(dat), function(i) coef(lm(val ~ date2, data = dat[(i-w):i,]))[2])
上一個答案:
我假設如果一個值與其先前值之間的變化大于 0,則增加,如果這種情況在六個連續值內發生 4 次或更多次,則您的條件 Groundwater_ST1 == TRUE:
library(dplyr)
library(RcppRoll)
dat %>%
mutate(change = dat$val - lag(dat$val)) %>%
mutate(incr = change > 0) %>%
mutate(roll_sum = roll_sum(incr, 6, align = "right", fill = NA)) %>%
mutate(Groundwater_ST1 = roll_sum >= 4)
結果:
date val change incr roll_sum Groundwater_ST1
1 2013-08-02 0.1470 NA NA NA NA
2 2014-06-13 0.0623 -0.0847 FALSE NA NA
3 2015-09-03 1.4600 1.3977 TRUE NA NA
4 2016-06-12 0.1810 -1.2790 FALSE NA NA
5 2016-09-27 0.0509 -0.1301 FALSE NA NA
6 2017-05-30 0.0801 0.0292 TRUE NA NA
7 2017-05-30 0.0801 0.0000 FALSE 2 FALSE
8 2017-09-14 0.0999 0.0198 TRUE 3 FALSE
9 2017-09-14 0.0980 -0.0019 FALSE 2 FALSE
10 2017-12-02 0.0820 -0.0160 FALSE 2 FALSE
11 2018-03-29 0.0698 -0.0122 FALSE 2 FALSE
12 2018-06-05 0.0884 0.0186 TRUE 2 FALSE
13 2018-10-19 0.1060 0.0176 TRUE 3 FALSE
14 2019-02-27 0.1010 -0.0050 FALSE 2 FALSE
15 2019-06-04 0.0984 -0.0026 FALSE 2 FALSE
16 2019-08-28 0.1050 0.0066 TRUE 3 FALSE
17 2019-10-22 0.1100 0.0050 TRUE 4 TRUE
18 2020-02-04 0.0980 -0.0120 FALSE 3 FALSE
19 2020-06-06 0.1000 0.0020 TRUE 3 FALSE
20 2020-08-26 0.1090 0.0090 TRUE 4 TRUE
21 2020-10-23 0.1050 -0.0040 FALSE 4 TRUE
22 2021-02-01 0.0662 -0.0388 FALSE 3 FALSE
23 2021-06-15 0.0944 0.0282 TRUE 3 FALSE
24 2021-08-03 0.1220 0.0276 TRUE 4 TRUE
資料:
dat <- data.frame(
date =c("2013-08-02", "2014-06-13", "2015-09-03", "2016-06-12", "2016-09-27", "2017-05-30", "2017-05-30", "2017-09-14", "2017-09-14", "2017-12-02", "2018-03-29", "2018-06-05", "2018-10-19", "2019-02-27", "2019-06-04", "2019-08-28", "2019-10-22", "2020-02-04", "2020-06-06", "2020-08-26", "2020-10-23", "2021-02-01", "2021-06-15", "2021-08-03"),
val = c(0.1470, 0.0623, 1.4600, 0.1810, 0.0509, 0.0801, 0.0801, 0.0999, 0.0980, 0.0820, 0.0698, 0.0884, 0.1060, 0.1010, 0.0984, 0.1050, 0.1100, 0.0980, 0.1000, 0.1090, 0.1050, 0.0662, 0.0944, 0.1220))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/492625.html
