确定变量返回到先前值的行数

问题描述 投票:0回答:1

我有一个数据框,其中包含不同像素的地上生物量的年度值。这些像素中的每一个都受到了干扰。我想确定每个像素需要多少行才能返回到其扰动前的值,但我不确定如何去做。

以下是一些示例数据:

pixel.no <- c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2)
year <- c(1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,
          1995,1996,1997,1998,1999,2000,2001,2002,2003,2004)
disturbed <- c("No","No","No","Yes","No","No","No","No","No","No",
               "No","No","Yes","No","No","Yes","No","No","No","No")
AGB <- c(200,204,205,150,155,170,190,205,202,207,
         180,181,100,110,150,130,150,160,180,200)

data <- data.frame(pixel.no,year,disturbed,AGB)
print(data)
   pixel.no year disturbed AGB
1         1 1995        No 200
2         1 1996        No 204
3         1 1997        No 205
4         1 1998       Yes 150
5         1 1999        No 155
6         1 2000        No 170
7         1 2001        No 190
8         1 2002        No 205
9         1 2003        No 202
10        1 2004        No 207
11        2 1995        No 180
12        2 1996        No 181
13        2 1997       Yes 100
14        2 1998        No 110
15        2 1999        No 150
16        2 2000       Yes 130
17        2 2001        No 150
18        2 2002        No 160
19        2 2003        No 180
20        2 2004        No 200

对于“disturbed”= Yes 的每个实例,我想计算行数,直到 AGB 的值返回到等于或大于上一年的值。所以对于上述数据我会得到:

[1] 4 2 3

对于在 R 中跨大型数据帧自动执行此操作的有效方法有什么建议吗?

r dplyr
1个回答
0
投票
library(dplyr)
# library(vctrs)
data |>
  mutate(
    .by = pixel.no,
    prev_undisturbed_AGB = vctrs::vec_fill_missing(
      if_else(disturbed == "Yes", lag(AGB), NA)),
    reached = coalesce(AGB >= prev_undisturbed_AGB, FALSE)
  )
#    pixel.no year disturbed AGB prev_undisturbed_AGB reached
# 1         1 1995        No 200                   NA   FALSE
# 2         1 1996        No 204                   NA   FALSE
# 3         1 1997        No 205                   NA   FALSE
# 4         1 1998       Yes 150                  205   FALSE
# 5         1 1999        No 155                  205   FALSE
# 6         1 2000        No 170                  205   FALSE
# 7         1 2001        No 190                  205   FALSE
# 8         1 2002        No 205                  205    TRUE
# 9         1 2003        No 202                  205   FALSE
# 10        1 2004        No 207                  205    TRUE
# 11        2 1995        No 180                   NA   FALSE
# 12        2 1996        No 181                   NA   FALSE
# 13        2 1997       Yes 100                  181   FALSE
# 14        2 1998        No 110                  181   FALSE
# 15        2 1999        No 150                  181   FALSE
# 16        2 2000       Yes 130                  150   FALSE
# 17        2 2001        No 150                  150    TRUE
# 18        2 2002        No 160                  150    TRUE
# 19        2 2003        No 180                  150    TRUE
# 20        2 2004        No 200                  150    TRUE

使用

.by=
需要
dplyr_1.1.0
或更新版本;如果您有旧版本,请将动词函数内的
.by=c(..)
更改为
group_by(..)
before 该动词函数(以及可选的
ungroup()
之后)。

© www.soinside.com 2019 - 2024. All rights reserved.