首页 > 解决方案 > 计算 r 中值组合的出现次数

问题描述

我正在处理有关不同案件的数据,这些案件在一段时间内经历了由不同案件组成的过程。每个案例都有一个唯一的 ID 号。一个过程可以以多个 fase 开始,并以 fase “Finished”结束(除了仍在进行的 fase)。一个案件​​可以经历多次。数据与此类似:

library(dplyr)
df1 <- structure(list(id = c("1", "1", "2", "2", "2", "2", "3", "3", 
"3", "3", "3", "3", "3", "3", "3", "3"), time = structure(c(17453, 
17458, 17453, 17462, 17727, 17735, 17453, 17484, 17568, 17665, 
17665, 17709, 17727, 17727, 17757, 17819), class = "Date"), old_fase = 
c(NA, "Fase 1", NA, "Fase 1", "Finished", "Fase 1", NA, "Fase 1", "Fase 2A", 
"Finished", "Fase 2A", "Fase 2B", "Finished", "Fase 2B", "Fase 1", 
"Fase 2A"), new_fase = c("Fase 1", "Finished", "Fase 1", "Finished", 
"Fase 1", "Finished", "Fase 1", "Fase 2A", "Finished", "Fase 2A", 
"Fase 2B", "Finished", "Fase 2B", "Fase 1", "Fase 2A", "Fase 2B"
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -16L))

对于我的分析,我想根据每个 id 的每个进程的出现来创建一个新的 id。在“id”和“new_fase”上使用 group_by 和 mutate 会产生以下错误的解决方案。这是因为第 11 行第一次出现“Fase 2B”。

df1 %>% 
group_by(id,new_fase) %>% 
mutate(occurrence=row_number())

正确的解决方案应如下所示:

df1 %>% 
mutate(occurrence = c(rep(1, 4), 2, 2, rep(1, 3), rep(2, 3), rep(3, 4)))

我尝试了多种方法并阅读了多个 Stackoverflow 帖子,但我无法正确理解。任何帮助表示赞赏,最好使用 tidyverse 解决方案。

标签: rdplyrtidyverse

解决方案


我们可以ave使用base R

df2$occurrence <- with(df2, ave(seq_along(id), id, fase, FUN = seq_along))

或与data.table

library(data.table)
setDT(df2)[, occurrence := seq_len(.N), .(id, fase)]

推荐阅读