你可以这样做:
df2 <- df |>
mutate(alive = 1) |>
group_by(time_ID, species) |>
complete(Year = min(df$Year):max(df$Year), fill = list(alive = 0)) |>
mutate(state = case_when(!alive & !cumsum(alive) ~ "unborn",
alive & cumsum(alive) == 1 ~ "new",
alive & cumsum(alive) > 1 ~ "old",
TRUE ~ "dead")) |>
ungroup()
输出:
# A tibble: 15 × 5
time_ID species Year alive state
<int> <chr> <int> <dbl> <chr>
1 1 A 2000 1 new
2 1 A 2001 1 old
3 1 A 2002 0 dead
4 1 B 2000 1 new
5 1 B 2001 0 dead
6 1 B 2002 0 dead
7 1 C 2000 1 new
8 1 C 2001 1 old
9 1 C 2002 1 old
10 1 D 2000 0 unborn
11 1 D 2001 0 unborn
12 1 D 2002 1 new
13 1 E 2000 0 unborn
14 1 E 2001 0 unborn
15 1 E 2002 1 new
然后我们可以做这样的事情:
df2 |> pivot_wider(id_cols = c(time_ID, species), names_from = Year, values_from = state)
创建:
time_ID species `2000` `2001` `2002`
<int> <chr> <chr> <chr> <chr>
1 1 A new old dead
2 1 B new dead dead
3 1 C new old old
4 1 D unborn unborn new
5 1 E unborn unborn new