R 基于以前的值更新列值(处理后始终处理)

R 基于以前的值更新列值(处理后始终处理),r,dplyr,data.table,dtplyr,R,Dplyr,Data.table,Dtplyr,我想知道是否有一种更快的方法可以使用data.table/dplyr按组替换基于以前值的值 假设我的原始数据表如下所示: DT_orig <- data.table(name = c("A", "A", "A", "B", "B", "B"), year = c("2001", "2002", "2003", "2001", "2002", "2003"), treat = c(1,0,0, 0,0,

我想知道是否有一种更快的方法可以使用data.table/dplyr按组替换基于以前值的值

假设我的原始数据表如下所示:

DT_orig <- data.table(name = c("A", "A", "A", "B", "B", "B"), 
                      year = c("2001", "2002", "2003", "2001", "2002", "2003"),
                      treat = c(1,0,0, 0,0,1))
这里,对于每个单独的名称和时间段年份,有一个列treat,指示他们是否被分配了治疗

我正在考虑另一种治疗方法,即一个人一旦接受治疗,他将继续接受治疗。因此,修改后的数据表应如下所示:

   name year treat
1:    A 2001     1
2:    A 2002     1
3:    A 2003     1
4:    B 2001     0
5:    B 2002     0
6:    B 2003     1
请注意,对于A个人而言,2001年接受治疗意味着他们也将在接下来的几年接受治疗

因为我有一个非常大的数据表,我想知道是否有一个非常快速的方法来修改实现这一点

也许我们可以使用R基的cummax

或者也可以使用dplyr进行同样的操作

或者使用base R

也许我们可以用R基地的cummax

或者也可以使用dplyr进行同样的操作

或者使用base R

我会使用cummax,但这里有一个替代方法来说明数据。表的联接语法:

DT_orig[, year := as.integer(year)]
DT_orig[DT_orig[treat == 1], on = .(year >= year, name), treat := 1L]

   name year treat
1:    A 2001     1
2:    A 2002     1
3:    A 2003     1
4:    B 2001     0
5:    B 2002     0
6:    B 2003     1
我会使用cummax,但这里有一个替代方法来说明数据。表的联接语法:

DT_orig[, year := as.integer(year)]
DT_orig[DT_orig[treat == 1], on = .(year >= year, name), treat := 1L]

   name year treat
1:    A 2001     1
2:    A 2002     1
3:    A 2003     1
4:    B 2001     0
5:    B 2002     0
6:    B 2003     1

这正是我想要的,非常简单!谢谢如果允许的话,我会接受你的回答。谁在否决这个解决方案。我是第一个带着cummax来的here@sindri_baldur这个例子显示数据是有序的这正是我想要的,非常简单!谢谢如果允许的话,我会接受你的回答。谁在否决这个解决方案。我是第一个带着cummax来的here@sindri_baldur该示例显示数据是有序的
library(dplyr)
DT_orig %>%
    group_by(name) %>%
    mutate(treat = cummax(treat))
DT_orig$treat <- with(DT_orig, ave(treat, name, FUN = cummax))
DT_orig[, year := as.integer(year)]
DT_orig[DT_orig[treat == 1], on = .(year >= year, name), treat := 1L]

   name year treat
1:    A 2001     1
2:    A 2002     1
3:    A 2003     1
4:    B 2001     0
5:    B 2002     0
6:    B 2003     1