我有一个数据框,其中包含不同像素的地上生物量的年度值。这些像素中的每一个都受到了干扰。我想确定每个像素需要多少行才能返回到其扰动前的值,但我不确定如何去做。
以下是一些示例数据:
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 中跨大型数据帧自动执行此操作的有效方法有什么建议吗?
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()
之后)。