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()获取新案例的运行计数。