【问题标题】:Calculate duration while counting overlapping years once only计算持续时间,同时只计算一次重叠年份
【发布时间】:2022-11-17 23:25:50
【问题描述】:

我有一个大型工作曝光数据库,我想计算每个主体对每个代理的曝光持续时间。但是一个主题可以通过不同的工作接触到代理。对于每份工作,我都有开始年份和结束年份。但我的问题是工作之间存在重叠期,我想找到与 R 接触代理的总持续时间,同时只计算重叠年一次(如果我在工作 1 中计算它,我不想在作业 2) 中重述。我添加了一个可以使用的数据(可以称为dat)。例如对于主题 2,他通过他的工作 1 和工作 2 接触到代理 A,我们有每个工作的 YEARIN 和 YEAROUT,但是这两个工作之间有 3 年的重叠(1998-2000)

ID JOB AGENT YEARIN YEAROUT
2 1 A 1998 2009
2 2 A 1996 2000
2 7 B 1979 1985
2 8 B 1978 1982
7 1 B 1973 2006
7 1 A 1973 2006
15 1 A 1979 2007
18 1 D 1976 1985
18 2 D 1980 2008
18 4 D 1970 2005
18 2 A 1978 1979
18 3 A 1984 1995
20 3 C 1988 1993
20 4 C 1996 2002
20 6 C 2000 2008

我想使用函数 mutate 和 aggregate,但我不确定如何考虑重叠的年份。

【问题讨论】:

  • 请使用 R 中的 dput() 函数添加您的数据。

标签: r


【解决方案1】:

这个怎么样:

library(dplyr)
library(tidyr)

dat <- tibble::tribble(
~ID,    ~JOB,   ~AGENT, ~YEARIN,    ~YEAROUT,
2,  1,  "A",    1998,   2009,
2,  2,  "A",    1996,   2000,
2,  7,  "B",    1979,   1985,
2,  8,  "B",    1978,   1982,
7,  1,  "B",    1973,   2006,
7,  1,  "A",    1973,   2006,
15, 1,  "A",    1979,   2007,
18, 1,  "D",    1976,   1985,
18, 2,  "D",    1980,   2008,
18, 4,  "D",    1970,   2005,
18, 2,  "A",    1978,   1979,
18, 3,  "A",    1984,   1995,
20, 3,  "C",    1988,   1993,
20, 4,  "C",    1996,   2002,
20, 6,  "C",    2000,   2008)


dat %>% 
  group_by(ID, JOB, AGENT) %>% 
  summarise(year = seq(YEARIN, YEAROUT, by=1)) %>% 
  unnest(year) %>% 
  group_by(ID, AGENT) %>% 
  summarise(nyear = length(unique(year)))
#> `summarise()` has grouped output by 'ID', 'JOB', 'AGENT'. You can override
#> using the `.groups` argument.
#> `summarise()` has grouped output by 'ID'. You can override using the `.groups`
#> argument.
#> # A tibble: 8 × 3
#> # Groups:   ID [5]
#>      ID AGENT nyear
#>   <dbl> <chr> <int>
#> 1     2 A        14
#> 2     2 B         8
#> 3     7 A        34
#> 4     7 B        34
#> 5    15 A        29
#> 6    18 A        14
#> 7    18 D        39
#> 8    20 C        19

reprex package (v2.0.1) 创建于 2022-11-17

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多