查找下一行匹配条件
Find the next row matching condition
df = data.frame(group_id = c(rep("a",5), rep("b",5)),
prod_id = 1:10,
prod_type = rep(c("a","a", "b", "c","d"),2),
start = lubridate::dmy(c("01/01/2001", "02/02/2002", "03/03/2003", "04/04/2004", "05/05/2005")),
fin = lubridate::dmy(c(NA,NA,NA,NA,NA)))
df
group_id prod_id prod_type start fin
1 a 1 a 2001-01-01 <NA>
2 a 2 a 2002-02-02 <NA>
3 a 3 b 2003-03-03 <NA>
4 a 4 c 2004-04-04 <NA>
5 a 5 d 2005-05-05 <NA>
6 b 6 a 2001-01-01 <NA>
7 b 7 a 2002-02-02 <NA>
8 b 8 b 2003-03-03 <NA>
9 b 9 c 2004-04-04 <NA>
10 b 10 d 2005-05-05 <NA>
数据将按 group_id
分组。我需要一种方法来识别每个组的每个 prod_id
下一个 prod_id
即,例如 prod_type
“a”、“c”或“d”。
试试这个:
library(dplyr)
# library(tidyr) # fill
df %>%
group_by(group_id) %>%
mutate(next_acd = if_else(lead(prod_type) %in% c("a","c","d"), lead(prod_id), prod_id[NA])) %>%
tidyr::fill(next_acd, .direction = "up") %>%
ungroup()
# # A tibble: 10 x 6
# group_id prod_id prod_type start fin next_acd
# <chr> <int> <chr> <date> <date> <int>
# 1 a 1 a 2001-01-01 NA 2
# 2 a 2 a 2002-02-02 NA 4
# 3 a 3 b 2003-03-03 NA 4
# 4 a 4 c 2004-04-04 NA 5
# 5 a 5 d 2005-05-05 NA NA
# 6 b 6 a 2001-01-01 NA 7
# 7 b 7 a 2002-02-02 NA 9
# 8 b 8 b 2003-03-03 NA 9
# 9 b 9 c 2004-04-04 NA 10
# 10 b 10 d 2005-05-05 NA NA
df = data.frame(group_id = c(rep("a",5), rep("b",5)),
prod_id = 1:10,
prod_type = rep(c("a","a", "b", "c","d"),2),
start = lubridate::dmy(c("01/01/2001", "02/02/2002", "03/03/2003", "04/04/2004", "05/05/2005")),
fin = lubridate::dmy(c(NA,NA,NA,NA,NA)))
df
group_id prod_id prod_type start fin
1 a 1 a 2001-01-01 <NA>
2 a 2 a 2002-02-02 <NA>
3 a 3 b 2003-03-03 <NA>
4 a 4 c 2004-04-04 <NA>
5 a 5 d 2005-05-05 <NA>
6 b 6 a 2001-01-01 <NA>
7 b 7 a 2002-02-02 <NA>
8 b 8 b 2003-03-03 <NA>
9 b 9 c 2004-04-04 <NA>
10 b 10 d 2005-05-05 <NA>
数据将按 group_id
分组。我需要一种方法来识别每个组的每个 prod_id
下一个 prod_id
即,例如 prod_type
“a”、“c”或“d”。
试试这个:
library(dplyr)
# library(tidyr) # fill
df %>%
group_by(group_id) %>%
mutate(next_acd = if_else(lead(prod_type) %in% c("a","c","d"), lead(prod_id), prod_id[NA])) %>%
tidyr::fill(next_acd, .direction = "up") %>%
ungroup()
# # A tibble: 10 x 6
# group_id prod_id prod_type start fin next_acd
# <chr> <int> <chr> <date> <date> <int>
# 1 a 1 a 2001-01-01 NA 2
# 2 a 2 a 2002-02-02 NA 4
# 3 a 3 b 2003-03-03 NA 4
# 4 a 4 c 2004-04-04 NA 5
# 5 a 5 d 2005-05-05 NA NA
# 6 b 6 a 2001-01-01 NA 7
# 7 b 7 a 2002-02-02 NA 9
# 8 b 8 b 2003-03-03 NA 9
# 9 b 9 c 2004-04-04 NA 10
# 10 b 10 d 2005-05-05 NA NA