在r中跨时间计数存活个体

icnyk63a  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(119)

我试图从最近的一年开始计算数据集中每年出现的个体数量。我的数据集看起来像这样:
| 身份证|坡度|学年|
| --------------|--------------|--------------|
| 1|九|“十七十八”|
| 1|10个|“十八十九”|
| 1|十一|“十九二十”|
| 1|十二岁|“二十二十一”|
| 二|九|“十七十八”|
| 二|10个|“十八十九”|
| 二|十一|“二十二十一”|
| 三|十一|“二十二十一”|
| 三|十二岁|“二十一二十二”|
| 四|九|“十七十八”|
| 四|10个|“十八十九”|
| 四|十一|“十九二十”|
| 四|十二岁|“二十二十一”|
我想知道20-21年的学生ID的数量,这些ID也出现在19-20年,并持续出现在18-19年,然后在17-18年再次出现。我想计算20-21年中的ID数量,这些ID在之前的每一年都存在。
我需要一个这样的表:
| 20-21中的ID数量|19-20中存在的20-21中的ID数量|18-19中存在的20-21的ID数量|17-18中存在的20-21的ID数量|
| --------------|--------------|--------------|--------------|
| 二百|一百八十|一百五十|一百四十|
我甚至不知道如何开始计算这个。

kg7wmglp

kg7wmglp1#

您可以使用filter()语句来完成此操作。在下面的代码中,过滤器正在查找四个学年指定中的每一个都存在于特定id中的组。例如,"17-18 %in% school_year,它在school_year的值中为每个特定id查找"17-18"

library(dplyr)
dat <- tibble::tribble(
  ~id,  ~grade, ~school_year,
1,  9,  "17-18",
1,  10, "18-19",
1,  11, "19-20",
1,  12, "20-21",
2,  9,  "17-18",
2,  10, "18-19",
2,  11, "20-21",
3,  11, "20-21",
3,  12, "21-22",
4,  9,  "17-18",
4,  10, "18-19",
4,  11, "19-20",
4,  12, "20-21")

下面是过滤后的数据,只包括满足条件的id

filt_dat <- dat %>% 
  group_by(id) %>% 
  filter("17-18" %in% school_year & "18-19" %in% school_year 
         & "19-20" %in% school_year & "20-21" %in% school_year) 
filt_dat
#> # A tibble: 8 × 3
#> # Groups:   id [2]
#>      id grade school_year
#>   <dbl> <dbl> <chr>      
#> 1     1     9 17-18      
#> 2     1    10 18-19      
#> 3     1    11 19-20      
#> 4     1    12 20-21      
#> 5     4     9 17-18      
#> 6     4    10 18-19      
#> 7     4    11 19-20      
#> 8     4    12 20-21

如果你只想要唯一的单个id值,你可以这样做:

filt_dat %>% 
  ungroup %>% 
  select(id) %>% 
  pull %>% 
  unique
#> [1] 1 4

编辑:更新问题的答案

如果一个观察必须在19-20中才能在18-19中计数,那么你可以弄清楚id是否在每一年中,将数据旋转更长的时间,然后在年内值上取累积乘积。

dat %>% 
  group_by(id) %>% 
  summarise(in_20_21 = "20-21" %in% school_year, 
            in_19_20 = "19-20" %in% school_year, 
            in_18_19 = "18-19" %in% school_year, 
            in_17_18 = "17-18" %in% school_year) %>% 
  pivot_longer(-id, names_to="yr", values_to="surv") %>% 
  group_by(id) %>% 
  mutate(surv = cumprod(surv)) %>% 
  group_by(yr) %>% 
  summarise(n=sum(surv))
#> # A tibble: 4 × 2
#>   yr           n
#>   <chr>    <dbl>
#> 1 in_17_18     2
#> 2 in_18_19     2
#> 3 in_19_20     2
#> 4 in_20_21     4

如果一个观测值不一定要在19-20中才能在18-19中计数,那么你可以过滤20-21中的观测值,然后只计算每年的观测值:

dat %>% 
  group_by(id) %>% 
  summarise(in_20_21 = "20-21" %in% school_year, 
            in_19_20 = "19-20" %in% school_year, 
            in_18_19 = "18-19" %in% school_year, 
            in_17_18 = "17-18" %in% school_year) %>% 
  filter(in_20_21) %>% 
  pivot_longer(-id, names_to="yr", values_to="surv") %>% 
  group_by(yr) %>% 
  summarise(n=sum(surv))
#> # A tibble: 4 × 2
#>   yr           n
#>   <chr>    <int>
#> 1 in_17_18     3
#> 2 in_18_19     3
#> 3 in_19_20     2
#> 4 in_20_21     4

创建于2023年3月20日,使用reprex v2.0.2

相关问题