R语言 按组计算所有可能的行对的重叠间隔

20jt8wwn  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(82)

我试图计算一个人在一年中与其他人一起工作的年数(即,一个人与他/她的同事的共同工作经验)。我的数据看起来像下面:

mydata <- data.frame(group_id= c(1,1,1,1,1,1,2,2),
                     individual_id= c(1,2,3,1,2,4,5,6),
                     working_since= c(2000,2005,1998,2000,2005,2009,2005,1990),
                     current_year= c(2008,2008,2008,2009,2009,2009,2008,2008)
                  )

可以看出,属于一个群体的个人数量随着时间的推移而变化,这取决于他们的工作决定;
因为我感兴趣的是计算一个人与她在同一个小组中的同事直到给定年份的共同工作经历(var =当前+年份),所以将对给定年份中一个小组中的所有行进行逐区比较。预期的输出如下所示:

mydata <- data.frame(group_id= c(1,1,1,1,1,1,2,2),
                     individual_id= c(1,2,3,1,2,4,5,6),
                     working_since= c(2000,2005,1998,2000,2005,2009,2005,1990),
                     current_year= c(2008,2008,2008,2009,2009,2009,2008,2008),
                     overlapping_years_caculation= c("4+9", "4+4", "9+4", "5+1", "6+1", "1+1", "4" "4")
                     overlapping+years+result = c(13, 8, 13, 6, 7, 2, 4, 4)

                  )

结果假设个人在年初开始她的任期。
我一直在进行广泛的搜索,看看是否有任何过去的职位类似于我的问题,事实上,我发现它比较一列的一行对所有其他的组。不幸的是,那篇文章中提供的代码在我的数据集上不起作用--也许是因为我有单独的开始和结束年份的列?
如果我能得到一些帮助,我将不胜感激。

lokaqttq

lokaqttq1#

mydata |> 
 mutate(time_length = interval(
  dmy(paste0("0101", working_since)),
  dmy(paste0("3112", current_year)) + days(1))) |> 
 group_by(group_id, current_year) |> 
   mutate(total_overlap = map_dbl(time_length, 
                             \(x) x |> 
                               intersect(time_length) |> 
                               int_length() |> 
                               sum(na.rm = T) - int_length(x)
   ) / 86400 / 365.25
  )

只是从你链接的答案中提取代码,并将其调整为适合你的问题。
library(lubridate)

yeotifhr

yeotifhr2#

我有一个稍微不同的方法,full_join按组/年计算所有个体,以获得groupXyear匹配的完整列表:

library(tidyverse)

mydata <- tibble(
  group_id = c(1, 1, 1, 1, 1, 1, 2, 2),
  individual_id = c(1, 2, 3, 1, 2, 4, 5, 6),
  working_since = c(2000, 2005, 1998, 2000, 2005, 2009, 2005, 1990),
  current_year = c(2008, 2008, 2008, 2009, 2009, 2009, 2008, 2008)
)

mydata |> 
  rename(ind_2 = individual_id, work2 = working_since) |> 
  full_join(mydata, by = join_by(group_id, current_year), relationship = "many-to-many") |> 
  filter(individual_id != ind_2) |> 
  rowwise() |> 
  mutate(overlap = length(intersect(working_since:current_year, work2:current_year))) |> 
  group_by(group_id, individual_id, current_year) |> 
  summarise(overlapping_years = sum(overlap), .groups = "drop") |> 
  arrange(group_id, current_year, individual_id)
#> # A tibble: 8 × 4
#>   group_id individual_id current_year overlapping_years
#>      <dbl>         <dbl>        <dbl>             <int>
#> 1        1             1         2008                13
#> 2        1             2         2008                 8
#> 3        1             3         2008                13
#> 4        1             1         2009                 6
#> 5        1             2         2009                 6
#> 6        1             4         2009                 2
#> 7        2             5         2008                 4
#> 8        2             6         2008                 4

相关问题