R 基于以前的值更新列值(处理后始终处理)
我想知道是否有一种更快的方法可以使用data.table/dplyr按组替换基于以前值的值 假设我的原始数据表如下所示: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,
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