【问题标题】:Creating ID by indicator variable within another ID and calculating rolling sum in R通过另一个 ID 中的指标变量创建 ID 并在 R 中计算滚动总和
【发布时间】:2021-11-25 02:19:31
【问题描述】:

我有一个数据集,其中包含患者 ID、一个“新”或“相同”的“情节”因子变量,以及一个持续时间变量。数据按 ID 分组并按日期变量排序(日期不在示例数据集中),因此“情节”变量表示该特定患者的“新”情节,或者它表示与该特定患者的“相同”情节排在它上面。我想创建两种不同类型的其他 ID 以及滚动总和。 “ID_2”将是患者内的情节的 ID(即在每个“ID”内)。 “ID_3”将是整个数据集中每一集的唯一 ID。 “sum”变量将是每个唯一剧集中每一行的总“持续时间”的滚动总和。

这段代码创建了我拥有的示例数据集:

ID <- c(1,2,3,3,3,3,3,3,3,4,4,5,6)
episode <- c("new","new","new","same","new","same","same","new","same","new","same","new","new")
duration <- c(10,13,11,2,45,66,2,4,45,33,23,12,16)
data1 <- cbind(ID,episode,duration)
data1 <- data.frame(data1)
data1$ID <- factor(data1$ID)
data1$episode <- factor(data1$episode)

这段代码创建了我希望输出的样子:

ID <- c(1,2,3,3,3,3,3,3,3,4,4,5,6)
episode <- c("new","new","new","same","new","same","same","new","same","new","same","new","new")
duration <- c(10,13,11,2,45,66,2,4,45,33,23,12,16)
ID_2 <- c(1,1,1,1,2,2,2,3,3,1,1,1,1)
ID_3 <- c(1,2,3,3,4,4,4,5,5,6,6,7,8)
sum_roll <- c(10,13,11,13,45,111,113,4,49,33,56,12,16)
data2 <- cbind(ID,episode,duration,ID_2,ID_3,sum_roll)
data2 <- data.frame(data2)
data2$ID <- factor(data2$ID)
data2$episode <- factor(data2$episode)
data2$ID_2 <- factor(data2$ID_2)
data2$ID_3 <- factor(data2$ID_3)

我查看了这个使用滑块求和的link,但我无法弄清楚如何使用指标变量 episode 结合 ID 来实现这一点。我也研究过使用 rleid() 但这似乎不是一个解决方案,因为我正在尝试根据 ID 和情节中的信息创建新 ID。

非常感谢您的帮助!这对我来说似乎是一个非常困难的问题。

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    使用cumsum 可能是您最好的选择:

    library(tidyverse)
    
    data1 %>% 
        group_by(ID) %>%
        mutate(`ID_2` = cumsum(episode == 'new')) %>%
        ungroup() %>%
        mutate(`ID_3` = cumsum(episode == 'new')) %>% 
        group_by(`ID_3`) %>% 
        mutate(sum_roll = cumsum(duration)) %>%
        ungroup()
    
    

    【讨论】:

    • 哇!非常感谢!!如此简单!
    猜你喜欢
    • 2023-03-17
    • 2014-08-15
    • 1970-01-01
    • 2020-12-06
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多