df <- readr::read_table("
date        caseID  subjectID   yr
2018-12-12  47582   000c15d0    4   
2018-12-12  47582   000c15d0    4   
2018-12-12  47584   000c15d0    4   
2018-12-12  47591   000c15d0    4   
2018-12-12  47594   000c15d0    4   
2018-12-12  47610   000c15d0    4   
2016-02-25  5222    0038263c    4   
2016-02-25  5222    0038263c    4   
2016-02-25  5223    0038263c    4   
2016-02-25  5223    0038263c    4")
Run Code Online (Sandbox Code Playgroud)
给定上述数据框,我需要创建一个列n_tot,该列创建每个条目总条目数的运行计数,subjectID以及一个n_case创建所有唯一caseID条目的运行计数的列。结果想:
date        caseID subjectID   yr n_tot n_case
2018-12-12  47582   000c15d0    4     1      1
2018-12-12  47582   000c15d0    4     2      1
2018-12-12  47584   000c15d0    4     3      2
2018-12-12  47591   000c15d0    4     4      3
2018-12-12  47594   000c15d0    4     5      4
2018-12-12  47610   000c15d0    4     6      5
2016-02-25  5222    0038263c    4     1      1
2016-02-25  5222    0038263c    4     2      1
2016-02-25  5223    0038263c    4     3      2
2016-02-25  5223    0038263c    4     4      2
Run Code Online (Sandbox Code Playgroud)
我有代码:
df %>%
  dplyr::group_by(subjectID, yr) %>%
  dplyr::arrange(date, caseID, .by_group = TRUE) %>%
  dplyr::mutate(n_case = dplyr::n_distinct(caseID)) %>%
  dplyr::ungroup(caseID) %>%
  dplyr::mutate(n_tot = seq(dplyr::n())) %>%
  dplyr::select(date, caseID, subjectID, yr, n_tot, n_case)
Run Code Online (Sandbox Code Playgroud)
但这正在产生:
date       caseID   subjectID  yr n_tot n_case
2018-12-12  47582   000c15d0    4     1      5
2018-12-12  47582   000c15d0    4     2      5
2018-12-12  47584   000c15d0    4     3      5
2018-12-12  47591   000c15d0    4     4      5
2018-12-12  47594   000c15d0    3     5      5
2018-12-12  47610   000c15d0    4     6      5
2016-02-25  5222    0038263c    4     1      2
2016-02-25  5222    0038263c    4     2      2
2016-02-25  5223    0038263c    4     3      2
2016-02-25  5223    0038263c    4     4      2
Run Code Online (Sandbox Code Playgroud)
我尝试了各种选项(例如seq(n_distinct(caseID)),但我无法得到任何东西来产生所需的结果。
这似乎给出了您想要的结果
df %>%
  group_by(subjectID) %>% 
  mutate(
    n_tot = row_number(),
    n_case=cumsum(!duplicated(caseID))
  )
Run Code Online (Sandbox Code Playgroud)
我们用于duplicated查看案例 ID 是否是新的,然后用于cumsum()获取新案例的运行计数。